如上所述,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/

    10-14 07:51