Объект сцены Vulkan мигает / мерцает во время преобразования с использованием унифицированного буфера

У меня проблема, когда я трансформирую (например, вращаю) объект (например, куб) в сцене, используя унифицированную матрицу MVP. Вращение не линейное, края объекта мерцают. Смотрите это https://drive.google.com/open?id=1L1Dx-LUdTdqvCQ23-o-vlI_yQK_t7l2_

  1. Я использую 3 свопчейна изображения / фреймбуфера / буфера глубины, одну команду буфер на каждый буфер кадра. (Я также пробовал 2,4 и более изображений)

  2. Я пытался использовать один унифицированный буфер для всех трех командных буферов и отдельные унифицированные буферы для каждого буфера команд.

  3. Текущий режим - VK_PRESENT_MODE_IMMEDIATE_KHR (также я пробовал FIFO_KHR)

  4. Обновление унифицированных буферов синхронизируется событиями в буфере команд и ожидающая очередь простаивает в цикле рисования, который блокирует мьютекс для обновления равномерный буфер. Данные обновляются для всех унифицированных буферов одновременно в одном вызове функции после цикла отрисовки разблокирует мьютекс а буфер команд уведомляет о завершении рисования.

  5. Буферы команд подготавливаются только один раз для каждой программы запуска, потому что любые данные внутри являются постоянными (например, дескриптор установлен в единый буфер)

  6. унифицированный буфер является видимым и согласованным для хоста, отображается во время создания

  7. основной цикл рисования выполняет стандартные операции

    • а) vkAcquireNextImageKHR
    • б) vkWaitForFences для образа подкачки
    • в) vkResetFences (б) забор
    • г) vkWaitForFences за предыдущую отправку
    • д) vkResetFences (г) забор
    • е) vkQueueSubmit с предварительно скомпилированным буфером cmd
    • ж) vkQueuePresentKHR
    • з) vkQueueWaitIdle
  8. Унифицированные буферы обновляются из основного потока по ключевым событиям. В течение нажмите кнопку Я увеличиваю угол Y на 1 градус после этого вызова glm :: повернуть с новым углом m_rot_prop.rotation = glm :: rotate (glm :: mat4 (1.0f), glm :: радианы (angle.y), glm :: vec3 (0.f, 1.0f, 0.f)); Рассчитать новую модель m_model = m_rot_prop.rotationm_trans_prop.transf ormm_scale_prop.scale; После этого эти данные копируются memcpy на единый указатель буфера.

  9. Изначально цикл рисования и основная нить разделены. Но у меня также есть попытался найти их обоих в основном потоке.

Я ввел такие события:

1) в буфер команд добавлено следующее:

vkBeginCommandBuffer...

vkCmdWaitEvents(cmd_buf, 1, &m_data_update_event[image_number],
VK_PIPELINE_STAGE_HOST_BIT,
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_HOST_BIT,
0, nullptr,
0, nullptr,
0, nullptr);

vkCmdSetEvent(cmd_buf, m_draw_progress_event[image_number],
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT);

vkCmdBeginRenderPass....
....
vkCmdEndRenderPass...

vkCmdResetEvent(cmd_buf, m_draw_progress_event[image_number], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT);

2) перед обновлением унифицированного буфера делаю

m_is_draw_paused = true;
for (uint32_t i = 0; i < m_choosen_swap_chain_details.imagesCount; i++)
{
vkResetEvent(m_logical_device, m_data_update_event[i]);
while (vkGetEventStatus(m_logical_device, m_draw_progress_event[i]) == VK_EVENT_SET)
{
boost::this_thread::sleep_for(boost::chrono::milli seconds(1));
}
}

3) обновить унифицированный буфер новой матрицей MVP (универсальный - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, VK_SHARING_MODE_EXCLUSIVE)

4) разрешить рендеринг

for (uint32_t i = 0; i < m_choosen_swap_chain_details.imagesCount; i++)
{
vkSetEvent(m_logical_device, m_data_update_event[i]);
}

Может кто знает причину мерцания?

Я не вижу мерцания или мигания в прикрепленном видео. Вы имеете в виду микростаттер?

krOoze 10.10.2018 14:51

Видео записывается со скоростью 30 кадров в секунду, но счетчик показывает 42 кадра в секунду. Это само по себе может вызвать некоторое заикание.

krOoze 10.10.2018 15:03

VkEvents может быть привередливым, чтобы получить права. Я бы попробовал обойтись без них. Крутиться на vkGetEventStatus, наверное, плохая идея. Измерьте, не спит ли sleep_for слишком много (некоторые платформы не могут справиться с такой небольшой дремотой). Использование Fences и QueueWaitIdle, вероятно, является излишним для управления цепочкой обмена. Использовать локальную память устройства явно вместо потоковой передачи унифицированного буфера.

krOoze 10.10.2018 15:41

"микростаттер" да, это можно так назвать. Но на видео видны микростатусы и большие сдвиги.

JiuShei 10.10.2018 19:07

>> Видео записывается со скоростью 30 кадров в секунду, но счетчик показывает 42 кадра в секунду. Это само по себе может вызвать некоторое заикание. да. Но на самом деле и наблюдаются большие лаги, и видео их показывает.

JiuShei 10.10.2018 19:07

>> Использовать локальную память устройства явно вместо потоковой передачи унифицированного буфера << Я пытался использовать локальную память устройства и копировать единое обновление из локальной памяти на устройство при каждом обновлении. Но это очень медленная операция и приносит больше лагов.

JiuShei 11.10.2018 08:28

последнее обновление drive.google.com/open?id=1J7KaVd2YTVUZEW1wviguf1Ogd58C7Vwb

JiuShei 15.10.2018 11:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
214
0

Другие вопросы по теме