Примеры Vulkan: за vkQueueSubmit всегда следует vkWaitForFences?

в API-образцы которые приходят с Vulkan, кажется, что всегда есть призыв к vkWaitForFences после звонка vkQueueSubmitлибо напрямую, либо через execute_queue_command_buffer (в util_init.hpp). Призыв к vkWaitForFences будет блокировать выполнение процессора до тех пор, пока графический процессор не завершит всю работу в предыдущем vkQueueSubmit, Это фактически не позволяет создавать несколько кадров одновременно, что (теоретически) значительно ограничивает производительность.

Требуются ли эти вызовы, и если да, есть ли другой способ не требовать простоя графического процессора перед созданием нового кадра?

8

Решение

То, как мы достигли нескольких кадров в полете, заключается в том, чтобы создать ограждение для каждого имеющегося у вас кадрового буфера обмена. Тогда еще пользуйся 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]);
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]