8

Vulkan に付属するAPI サンプルでは、​​直接または(util_init.hpp で)を介して、vkWaitForFencesへの呼び出しの後に常に への呼び出しがあるようです。への呼び出しは、GPU が前の ですべての作業を完了するまで CPU の実行をブロックします。これにより、実際には複数のフレームを同時に構築することができなくなり、(理論上) パフォーマンスが大幅に制限されます。vkQueueSubmitexecute_queue_command_buffervkWaitForFencesvkQueueSubmit

これらの呼び出しは必要ですか? その場合、新しいフレームを構築する前に GPU をアイドル状態にする必要がない別の方法はありますか?

4

1 に答える 1

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]);
}
于 2016-02-23T09:15:05.863 に答える