代码之家  ›  专栏  ›  技术社区  ›  lvella

重置命令缓冲区是否比设置统一缓冲区更快?

  •  4
  • lvella  · 技术社区  · 8 年前

    我正在努力学习Vulkan(主要是从 vulkan-tutorial.com )在编写混合图形/计算应用程序时(我需要呈现深度缓冲区并在其上执行一些计算,不显示)。我几乎要渲染我的第一个(深度)图像,我所要做的就是找出如何传递一个 vec4 作为顶点着色器的唯一参数(除了“位置”属性)。

    我读到的所有地方都说push常量比uniforms快,因此它们似乎是我的参数的明显选择,但似乎我需要在每个渲染图像上重置命令缓冲区,以便用 vkCmdPushConstants() ,而使用uniforms时,我可以保持命令缓冲区不变,只需更新映射的内存区域(如果不一致,则刷新),然后使用 vkQueueSubmit() .

    重写整个命令缓冲区真的比映射内存写快吗?或者说推送参数更快的人假设命令缓冲区将在每个渲染图像处重建,所以大部分成本已经支付了?

    最后,我可以更新另一个命令缓冲区中的push常量吗?更小的,以前提交的,用信号量与另一个命令缓冲区同步吗(我想不是,但我不清楚一个常量被推多长时间是有效的,也不清楚一个管道在这个问题上被绑定了多长时间。)如果可能的话,这是一个好的方法吗?

    编辑:不,不可能,只是找到了 here 即:

    每个命令缓冲区独立于其他命令缓冲区管理状态。

    和

    当命令缓冲区开始记录时,该命令中的所有状态 缓冲区未定义。

    因此,我的问题仍然存在。

    1 回复  |  直到 8 年前
        1
  •  4
  •   Nicol Bolas    8 年前

    重写整个命令缓冲区真的比映射内存写快吗?

    这是个错误的问题。你没有考虑到修改内存的实际需要,这样GPU就可以使用它。

    好的,你已经得到了这个命令缓冲区,它可以从内存中读取制服。你想在两个独立的框架中使用它但是你想改变帧之间的内存。

    好吧,在第一帧读取完之前,你不能写入内存所以你需要CB在最后一次读取制服后设置一个事件在提交该帧的cb之后,您需要在cpu上等待该事件,然后才能写入数据(更不用说提交下一帧的数据了)。

    这就是CPU/GPU同步这对gpu性能或cpu性能都不好。GPU可能会因为CPU必须执行这样的同步而耗尽工作,而CPU可能只是坐在那里无所事事。

    重建大多数命令缓冲区是Vulkan应用程序的典型工作方式。

    推荐文章