假设我有一个交换链,其中包括n
图像和我允许k
“飞行中的帧”。我确保之间的正确同步vkAcquireNextImageKHR
, vkQueueSubmit
and vkQueuePresentKHR
通过一组信号量imageAvailableSemaphore
and renderFinishedSemaphore
和栅栏imageInFlight
就像它是在本教程 https://vulkan-tutorial.com/Drawing_a_triangle/Drawing/Rendering_and_presentation:
imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT);
inFlightFences.resize(MAX_FRAMES_IN_FLIGHT);
需要栅栏来确保在 GPU 完成消耗相应图像之前我们不会再次使用信号量。因此,这个栅栏需要在vkQueueSubmit
.
另一方面,我正在独立于“飞行中的帧”创建命令缓冲区。它们是“一次性提交”命令缓冲区。因此,一旦提交,我就把它们添加到“待删除”列表中。我需要知道 GPU 何时完成此列表中命令缓冲区的执行。
但我无法指定另一个栅栏vkQueueSubmit
。我怎么解决这个问题?
I allow k
“飞行中的帧”
嗯,这就是你的答案。将为“帧”提供命令缓冲区的每个线程都应该有多个k
命令缓冲区。他们应该以环形缓冲区的方式使用它们。这些命令缓冲区应该从瞬态分配池创建。当他们从环形缓冲区中选择最近最少使用的 CB 时,他们应该在记录到其中之前重置它。
确保没有线程尝试重置仍在使用的 CBstarting下一帧的任何工作直到k
过去的第 1 帧已完成(使用栅栏)。
如果由于某种原因你绝对cannot告诉你的线程什么k
是在前面的,你仍然需要告诉他们某物。当您开始在线程上工作时,您需要告诉他们还有多少帧仍在战斗中。这允许他们根据帧数检查环形缓冲区的大小。如果环形缓冲区中的元素数量小于帧数量,则环形缓冲区中最旧的CB不被使用。否则,它必须从池中分配一个新的 CB 并将其推入环形缓冲区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)