我正在使用 Vulkan graphics 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,迫使你明确地说这是你想要的(而且它几乎从来不是你想要的)。
关于graphics - 为什么 vkAcquireNextImageKHR() 从不阻塞我的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60419749/