我正在使用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,迫使你明确地说这是你想要的(几乎从来不是你想要的(。