Призрак Вулкана при использовании VK_PRESENT_MODE_FIFO_KHR - PullRequest
0 голосов
/ 18 января 2020

У меня есть небольшой пример, написанный на C с использованием API Vulkan. Я следовал руководству vulkan-tutorial до конца главы «Единые буферы». Хотя это руководство написано на C ++, я использую обычный C, поэтому мои коды немного отличаются в некоторых местах. Кроме того, я решил использовать DynamicState вместо воссоздания всей GraphicsPipeline при каждом изменении размера окна. Кроме того, я изменил оба, чтобы всегда использовать VK_PRESENT_MODE_FIFO_KHR. Кажется, что я допустил некоторую ошибку, адаптируя код, потому что я получаю много ореолов и хаотичности от вращающегося четырехугольника, как можно увидеть здесь: video . Слева - мой результат, а справа - оригинал.

Теории и наблюдения:

  • Кажется, что мой обновляется гораздо медленнее, как при половине частоты кадров. Но я измерил, что UBO обновляются с той же частотой, что и в оригинале.
  • Другая причина могла состоять в том, что изображения Swapchain отображаются в неправильном порядке. Как старые изображения представлены без перерисовки. Я пытался исключить любые проблемы синхронизации, вызывая vkDeviceWaitIdle в каждой итерации основного l oop. Это не улучшило ситуацию.
  • Если вы присмотритесь, вы увидите, что у оригинала также есть небольшое количество ореолов. Я думаю, что это можно отнести к монитору. Это не объясняет, почему эта проблема гораздо более выражена в моей программе.
  • Я вернулся к нединамическим c Видовым окнам, Ножницам и вообще отключил изменение размера, чтобы исключить это. Это не было причиной.
  • Код C использует cglm вместо glm. Я поменялся глм в оригинале. Это не причина.
  • Интересное наблюдение: при быстром изменении размера окна проблема исчезает на время операции изменения размера.

Я довольно много искал проблема. Но ничего не нашел. Я не ожидаю отладки моего кода для меня. Если вы не хотите. Но, может быть, вы знакомы с базой кода vulkan-tutorial и знаете, что могло его вызвать.

ОБНОВЛЕНИЕ:

Я до сих пор не понял проблему. Но, пытаясь воспроизвести проблему с помощью более краткого кода, я переписал все с нуля, но не смог воспроизвести проблему. Теперь я добавил все функции, которыми обладала неисправная версия, и она все еще работает нормально.

...