让我们说,对于呈现设置来说,我们有一个可以双缓冲或三缓冲的呈现器,并且可以在运行时动态地更改此缓冲。因此,在任何时候,它都是2到3帧飞行(FIF)。
帧资源(如缓冲区)被复制以匹配FIF计数。缓冲区创建得足够大,足以容纳(帧数据大小* offsetted ),并相应地对这些缓冲区进行读写设置。
为了抵消缓冲区的影响,使用单调的循环指数是否足够好呢?
double buffer: 0, 1, 0, 1, 0, 1, ...
triple buffer: 0, 1, 2, 0, 1, 2, ...然后,如果对first运行时进行了更改,我们首先在GPU上使用WaitIdle(),然后将该索引重置为0。
这是一种安全的缓冲方式吗,这样我们就不会践踏GPU?仍在使用的数据。
我特别不确定如何使用带交换链邮箱当前模式的三缓冲区设置。
发布于 2022-06-11 15:49:59
我们首先在GPU上使用WaitIdle(),然后将这个索引重置为0。
想必,您是在谈论vkDeviceWaitIdle (这是一个几乎不应该使用的函数)。如果是这样的话,那么就非交换链资产而言,这是安全的.vkDeviceWaitIdle将停止CPU,直到GPU设备完成了所给出的所有工作。
交换链的规则不会因为你等待而改变。在尝试使用它之前,您仍然需要获取下一个图像,等等。
然而,在这里等待是没有意义的。如果您所做的只是将索引重置为0,这意味着您没有重新分配任何内存。所以,如果你从3个缓冲器变成2个,你仍然有三个缓冲器值的存储,而且你只使用其中的两个。
那么你等待完成了什么呢?您可以继续循环通过您的3个缓冲区的存储,即使你只有2个交换链图像。
等待的唯一要点是是否需要释放存储(如果要从2到3个缓冲区,则分配更多存储空间)。即便如此,等待的唯一理由是,如果在分配新内存之前删除现有内存是绝对必要的。
https://stackoverflow.com/questions/72585421
复制相似问题