2016-02-22 13 views
7

Trong số API-Samples đi kèm với Vulkan, có vẻ như luôn có một cuộc gọi đến vkWaitForFences sau khi gọi tới số vkQueueSubmit, trực tiếp hoặc qua execute_queue_command_buffer (trong util_init.hpp). Cuộc gọi đến vkWaitForFences sẽ chặn thực thi CPU cho đến khi GPU hoàn tất tất cả công việc trong vkQueueSubmit trước đó. Điều này có hiệu lực không cho phép nhiều khung được xây dựng đồng thời, mà (theo lý thuyết) đang hạn chế hiệu suất đáng kể.Mẫu Vulkan: vkQueueSubmit luôn theo sau bởi vkWaitForFences?

Các cuộc gọi này có cần thiết không và nếu có, có cách nào khác không yêu cầu GPU không hoạt động trước khi xây dựng khung mới không?

+0

dường như giống với các mẫu D3D12 đầu mà cũng chỉ làm mô hình one-frame-và-chờ đợi. –

+0

vâng, trớ trêu thay, một trong những mục tiêu chính của việc giới thiệu các API là đạt được tính song song cao hơn, và sau đó các mẫu chỉ ra cách * không * làm điều đó;). – MuertoExcobito

Trả lời

4

Cách chúng tôi đạt được nhiều khung hình trong chuyến bay là có một hàng rào cho mỗi bộ đệm khung hình mà bạn có. Sau đó, vẫn sử dụng vkWaitForFences nhưng đợi cho hàng rào ((n+1)%num_fences).

Có mã ví dụ ở đây 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]); 
} 
+1

Nhưng việc viết mã này phức tạp hơn một chút vì bạn không thể thay đổi bất kỳ bộ đệm nào vẫn đang được các khung hình sử dụng trong chuyến bay. –

+0

Vâng, nó khá phức tạp hơn một chút :) Bạn sẽ cần các UBO đa bộ đệm để bạn không ghi dữ liệu mà GPU đang sử dụng. Bạn cũng cần phải lo lắng về các rào cản đường ống để bộ nhớ cache không cung cấp cho bạn dữ liệu cũ. Có những ví dụ về cả hai trong liên kết đó. – ashleysmithgpu

Các vấn đề liên quan