Почему vkAcquireNextImageKHR () никогда не блокирует мой поток? - PullRequest
1 голос
/ 26 февраля 2020

Я использую Vulkan graphics API (через BGFX ) для рендеринга. И я измерял, сколько (настенные часы) времени занимают мои звонки.

Что я не понимаю, так это то, что vkAcquireNextImageKHR () всегда быстр и никогда не блокируется. Даже если я отключаю тайм-аут и использую семафор для ожидания презентации.

Презентация привязана к частоте отображения 60 Гц, и я вижу, что мой main-l oop действительно работает при 16,6 или 33,3 мс .

Разве я не вижу время ожидания для этой скорости отображения, отображаемое на длине вызова vkAcquireNextImageKHR()?

Профилировщик измеряет этот вызов как 0,2 мс или около того, и никогда существенная часть кадра.

VkResult result = vkAcquireNextImageKHR(
    m_device
  , m_swapchain
  , UINT64_MAX
  , renderWait
  , VK_NULL_HANDLE
  , &m_backBufferColorIdx
);

Целевое оборудование - это портативная консоль.

1 Ответ

3 голосов
/ 26 февраля 2020

Целью Vulkan является устранение узких мест ЦП. Остановка процессора до тех пор, пока графический процессор не будет готов к чему-либо, была бы противоположностью этому. Особенно, если сам процессор на самом деле не собирается использовать результат этой операции.

Таким образом, вся функция vkAcquireNextImageKHR позволяет вам узнать, какое изображение будет доступно вам в следующий раз. Это минимум, который должен произойти, чтобы вы могли использовать это изображение (например, путем создания командных буферов, которые каким-либо образом ссылаются на изображение). Тем не менее, это изображение еще не , но доступно для вас.

Вот почему эта функция требует, чтобы вы предоставили семафор и / или забор: чтобы процесс, который потребляет изображение, мог ждать чтобы изображение стало доступным.

Если процесс, который потребляет изображение, представляет собой просто набор команд в буфере команд (ie: то, что вы отправляете с помощью vkQueueSubmit), вы можете просто получить это Пакетная работа ждет семафора, переданного операции получения. Это означает, что все ожидания происходят в графическом процессоре. Где он принадлежит.

Забор есть, если вы (по какой-то причине) хотите, чтобы ЦП мог ждать, пока не будет выполнено получение. Но Vulkan, как явный низкоуровневый API, заставляет вас явно сказать, что это то, что вы хотите (а это почти никогда не то, что вы хотите).

...