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



我正在使用Vulkan图形API(通过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函数所做的只是让您知道下一步将提供哪个图像。这是您能够使用该图像所需的最低限度(例如,通过构建以某种方式引用图像的命令缓冲区(。但是,您还无法使用该图像。

这就是为什么这个函数要求您提供一个信号量和/或围栏:这样消耗图像的进程就可以等待图像可用。

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

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

相关内容

  • 没有找到相关文章

最新更新