如上所述,here vkQueueWaitIdle 相当于 vkFence。
因此,在哪种情况下可以使用它们中的任何一个。
最佳答案
如你所说,vkQueueWaitIdle()
只是 Fence 使用的一个特例。
因此,当您必须编写 10 行等效的 Fence 代码时,您会使用它——特别是如果您不关心记住所有以前的队列提交。它在某种程度上是一种调试功能(大多数情况下,您会临时使用它来测试您的同步)。并且在清理期间(例如,应用程序终止或重建交换链)可能很有用。
在所有其他情况下,您应该更喜欢 VkFence
s,它更通用:
vkWaitForFences()
用法。 IE。等待一与等待全部和 timeout
。 vkQueueWaitIdle()
做到这一点)。您可以执行以下操作:vkQueueSubmit( q, 1, si1, fence1 );
vkQueueSubmit( q, 1, si2, fence2 );
vkWaitFences( fence1 ); // won't block on the 2nd submit unlike vkQueueWaitIdle(q)
这甚至可能比:vkQueueSubmit( q, 1, si1, 0 );
vkQueueWaitIdle(q);
vkQueueSubmit( q, 1, si2, 0 );
vkGetFenceStatus()
。例如。有一些后台工作,只是在你做其他工作时定期询问它是否已经完成。 VkFence
即使在相同的情况下也可能更快。 vkQueueWaitIdle()
可能被实现为vkQueueSubmit( q, 0, nullptr, fence );vkWaitFences( fence, infiniteWait );
您可能会为 vkQueueSubmit
支付额外费用。 关于vulkan - 对于 vkQueueSubmit,在什么情况下 VkFence 比 vkQueueWaitIdle 更好?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39537176/