vkAcquireNextImageKHR 语义?超时是什么意思?

vkAcquireNextImageKHR semantics? What does timing out mean?

我对 vkAcquireNextImageKHR 的语义感到困惑。具体在什么情况下函数return可以VK_TIMEOUT?即什么可以阻止它无法立即获取图像?它可能等待发生什么?

似乎即使表示引擎还没有完成从图像中读取图像也可以获取图像,并且无论如何都需要使用信号量或栅栏来同步获取图像的使用。我错过了什么?

所有这些都是实现定义的。

然而,标准给出了一个明确的案例:

An image will eventually be acquired if the number of images that the application has currently acquired (but not yet presented) is less than or equal to the difference between the number of images in swapchain and the value of VkSurfaceCapabilitiesKHR::minImageCount. If the number of currently acquired images is greater than this, vkAcquireNextImageKHR should not be called; if it is, timeout must not be UINT64_MAX.

因此,如果您已经获取了交换链中的所有可用图像并且尚未呈现它们,那么您可能会超时。

可能还有其他情况,但同样,这些是实现定义的。 vkAcquireNextImageKHR 的完全有效实现可以向您在 returns 之前提供的 semaphore/fence 发出成功获取的信号,从而迫使任何延迟进入 vkAcquireNextImageKHR 调用本身。你无法控制这个。

Nicol Bolas 的回答是正确的,但由于对它的回答询问了有关在实际实现中使用它的详细信息,我将在此处添加另一个答案。

在 Android 上,vkQueuePresentKHR 将图像发送到显示图像的合成器 (SurfaceFlinger)。合成器在每次显示刷新时重新显示此图像,直到它获得要显示的新图像 window。在获取下一张图像之前,它不知道将来是否需要再次读取缓冲区或需要读取多少次,并且无法创建信号量来在最后一次读取完成时发出信号。 (假设地,您可以构建一个 可以 做到这一点的系统,但这不是 Linux 内核同步机制 Android 用于这项工作的方式。)所以直到你当前图像 N+1,合成器无法将图像 N 释放回您的应用程序以供其获取,因为它无法为您提供信号量。

比这要复杂一点,因为即使你呈现第 N+1 帧,合成器也不知道在渲染信号量发出信号之前需要多长时间,所以它仍然不能立即知道多少需要更长的时间才能读取第 N 帧的图像。

这扩展到具有两个以上缓冲区的交换链。

我对其他系统不太熟悉,但我相信其他系统也有类似的限制,阻止他们允许您在呈现图像之前任意远地获取图像。构建一个允许这样做的表示引擎绝对是可能的,但 Vulkan 需要在现有系统和现有表示引擎上工作,因此必须忍受这些现有系统强加的限制。 Khronos 成员无法更改 Windows 合成器,X11、Wayland 和 Android 等其他 difficult/slow 需要更改,因为这样做可能会影响所有现有的应用程序、框架等