为什么 vkAcquireNextImageKHR() 从不阻塞我的线程?

Why does vkAcquireNextImageKHR() never block my thread?

我正在使用 Vulkan graphics API (via BGFX) 进行渲染。我一直在测量我的通话时间。

我不明白的是 vkAcquireNextImageKHR() 总是很快,而且从不阻塞。即使我禁用超时并使用信号量等待演示。

演示文稿锁定为 60Hz 显示速率,我确实看到我的主循环 运行 为 16.6 或 33.3 毫秒。

我不应该在 vkAcquireNextImageKHR() 调用的长度中看到此显示速率的等待时间吗?

探查器将此调用测量为 0.2 毫秒左右,而不是帧的重要部分。

VkResult result = vkAcquireNextImageKHR(
    m_device
  , m_swapchain
  , UINT64_MAX
  , renderWait
  , VK_NULL_HANDLE
  , &m_backBufferColorIdx
);

目标硬件是掌上游戏机。

Vulkan 的全部目的是缓解CPU 瓶颈。让 CPU 停止直到 GPU 准备好处理某事将与此相反。特别是如果 CPU 本身实际上不会使用此操作的结果。

因此,所有 vkAcquireNextImageKHR 功能的作用就是让您知道下一张图片可供您使用。这是您能够使用该图像所需发生的最低限度(例如,通过构建以某种方式引用该图像的命令缓冲区)。但是,您无法使用该图像。

这就是此函数要求您提供信号量的原因 and/or 栅栏:以便使用图像的进程可以等待图像可用。

如果使用图像的进程只是命令缓冲区中的一堆命令(即:您使用 vkQueueSubmit 提交的内容),您可以简单地让那批工作等待给定的信号量获取操作。这意味着所有等待都发生在 GPU 中。它属于哪里。

如果您(出于某种原因)希望 CPU 能够等到获取完成,那么围栏就在那里。但是 Vulkan,作为一个明确的、低级的 API,迫使你明确地说这是你想要的(而且它几乎从来不是你想要的)。