в API-образцы которые приходят с Vulkan, кажется, что всегда есть призыв к vkWaitForFences
после звонка vkQueueSubmit
либо напрямую, либо через execute_queue_command_buffer
(в util_init.hpp). Призыв к vkWaitForFences
будет блокировать выполнение процессора до тех пор, пока графический процессор не завершит всю работу в предыдущем vkQueueSubmit
, Это фактически не позволяет создавать несколько кадров одновременно, что (теоретически) значительно ограничивает производительность.
Требуются ли эти вызовы, и если да, есть ли другой способ не требовать простоя графического процессора перед созданием нового кадра?
То, как мы достигли нескольких кадров в полете, заключается в том, чтобы создать ограждение для каждого имеющегося у вас кадрового буфера обмена. Тогда еще пользуйся 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]);
}
Других решений пока нет …