重置命令缓冲区比设置统一缓冲区快吗?

时间:2018-07-17 01:29:49

标签: vulkan

在编写混合图形/计算应用程序时,我试图学习Vulkan(主要从vulkan-tutorial.com学习)(我需要渲染深度缓冲区并对其进行一些计算,没有显示)。我几乎要渲染我的第一个(深度)图像,而我要做的就是弄清楚如何将单个vec4作为唯一参数传递给我的顶点着色器(除了position属性)。

我读过的所有地方都说推送常数比制服要快,因此它们似乎是我参数的明显选择,但似乎我需要在每个渲染图像上重置命令缓冲区,以便使用{{ 1}},在使用制服的情况下,我可以保持命令缓冲区固定,并在使用vkCmdPushConstants()提交渲染任务之前,只需更新映射的内存区域(并刷新(如果不一致,则刷新))。

重写整个命令缓冲区真的比映射的内存写入快吗?还是有人说推入参数更快,是否假设将在每个渲染图像上重建命令缓冲区,所以无论如何大部分成本已经支付了?

最后,我可以在另一个较小的,先前提交的命令缓冲区中更新推送常量,并使用信号量与另一个命令缓冲区同步吗? (我想不是,但是就这个问题而言,我尚不清楚常数被推送的有效时间是多少,或者管道保持绑定的时间。)如果可能的话,这是一个好方法吗?

编辑:不可能,这不可能,只是发现here

  

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

  

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

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

1 个答案:

答案 0 :(得分:4)

  

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

这是错误的问题。您没有考虑到实际修改内存以使GPU可以使用它的时间。

好的,因此您已经获得了从某些内存读取制服的命令缓冲区。您想在两个单独的框架中使用它。但是您想在帧之间更改内存。

好吧,直到第一帧读取完毕,您才能写入该内存。因此,您需要CB在上一次读取制服后设置一个事件。在为该帧提交CB之后,您需要在CPU上等待该事件,然后才能写入数据(更不用说提交下一帧的数据了)。

这就是CPU / GPU同步。这对于GPU性能或CPU性能而言不是很好。 GPU可能会耗尽,因为CPU必须执行此类同步,而CPU可能只是坐在那里而无所事事。

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