Как избежать эффекта желоба с Vulkan на wm_size?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как избежать эффекта желоба с Vulkan на wm_size?

Сообщение Anonymous »

Мое приложение Windows использует Vulkan для рендеринга в область клиента окна. Когда я изменяю размер окна, появляется желоб. Эффект наиболее заметен при сокращении окна, а не увеличивает его. Образы Swapchain (низкая задержка).
[*] Использование представленного режима FIFO. Я мог бы задержать отдых и повторное использование Swapchain, обрабатывая wm_entersizemove /

Код: Выделить всё

WM_EXITSIZEMOVE
(обновление ширины/высоты на wm_size ), но это приводит к масштабированию контента во время изменения размера, которое я не хочу.

Я вызываю draw () на каждом сообщении wm_size . В Draw I Do:

Код: Выделить всё

VkSurfaceCapabilitiesKHR surface_capabilities;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vk->gpu, vk->surface, &surface_capabilities);
if (surface_capabilities.currentExtent.width != vk->swapchain_extent.width ||
surface_capabilities.currentExtent.height != vk->swapchain_extent.height) {
vkQueueWaitIdle(vk->graphics_queue);
vk->swapchain_extent = surface_capabilities.currentExtent;
vk_create_swapchain(vk);
vk_reset_resources(vk);
}
< /code>
Насколько я понимаю, если изображения, представленные в старом размере, все еще в очереди, они будут продолжать представлять DWM на последующих V-бланках. Например, если у меня было 2 кадра в очереди при 500 × 500, когда я воссоздал Swapchain (теперь 480 × 480) и 16,6 мс искали, эти два 500 × 500 кадров все еще будут показаны при ~ 33,2 мс и ~ 50 мс. Первая рама правильного размера (480 × 480) не появится до ~ 66,6 мс. < /P>
Это имеет смысл. Однако при сокращении окна я ожидаю, что DWM вытянет старую раму 500 × 500 до 480 × 480, а не показывает желоба. Поскольку я вижу белые желоба (hbrBackground
белый), это, похоже, не происходит. Переход на почтовый ящик помогает, поскольку эффект менее заметен (хотя и не полностью исчез). В качестве взлома я мог бы переключиться на почтовый ящик во время изменения размера и вернуться к FIFO на wm_exitsizemove , но это чувствует себя неправильно. Я также экспериментировал с: < /p>
// requires VK_EXT_swapchain_maintenance1
VkSwapchainPresentScalingCreateInfoEXT scaling_info = {
.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT,
.pNext = NULL,
.scalingBehavior = VK_PRESENT_SCALING_STRETCH_BIT_EXT,
.presentGravityX = VK_PRESENT_GRAVITY_CENTERED_BIT_EXT,
.presentGravityY = VK_PRESENT_GRAVITY_CENTERED_BIT_EXT,
};
< /code>
Но это не имеет значения. Независимо от нынешнего режима гравитации и масштабирования, водосточный желоб всегда виден в нижней/справа от окна. Я проверил, как ведут себя другие приложения: Chrome не заботится, и вы можете видеть уродливые желоба при изменении размера. Но приложения с интенсивными графиками, такие как Blender, имеют очень чистый Resisize.
Как я могу избавиться от желоба?

Подробнее здесь: https://stackoverflow.com/questions/797 ... on-wm-size
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»