在Vulkan随附的API-Samples中,似乎在直接或通过vkWaitForFences
(在util_init.hpp中)调用vkQueueSubmit
之后始终存在对execute_queue_command_buffer
的调用。对vkWaitForFences
的调用将阻止CPU执行,直到GPU完成上一个vkQueueSubmit
中的所有工作为止。实际上,这不允许同时构造多个框架,(从理论上来说)这在很大程度上限制了性能。
是否需要这些调用,如果需要,是否还有另一种方法可以在构造新帧之前不要求GPU处于空闲状态?
最佳答案
我们在飞行中获得多个帧的方法是为您拥有的每个交换链帧缓冲区都设置一个围栏。然后仍然使用vkWaitForFences
,但要等待((n+1)%num_fences)
围栏。
这里有示例代码https://imgtec.com/tools/powervr-early-access-program/
uint32_t current_buffer = num_swaps_ % swapchain_fences.size();
vkQueueSubmit(graphics_queue, 1, &submit_info, swapchain_fences[current_buffer]);
// Wait for a queuesubmit to finish so we can continue rendering if we are n-2 frames behind
if(num_swaps_ > swapchain_fences.size() - 1)
{
uint32_t fence_to_wait_for = (num_swaps_ + 1) % swapchain_fences.size();
vkWaitForFences(device, 1, &swapchain_fences[fence_to_wait_for], true, UINT64_MAX);
vkResetFences(device, 1, &swapchain_fences[current_buffer]);
}
关于c++ - Vulkan样本: vkQueueSubmit always followed by vkWaitForFences?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35563795/