Как избежать эффекта желоба (цвет BG внизу/справа от окна) с Vulkan на wm_size (winapi)?C++

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

Сообщение Anonymous »

У меня есть простое приложение для Windows, которое использует Vulkan для рендеринга в клиентской области окна. Когда я изменяю размер окна, появляется желоб (как показано на скриншоте). Эффект наиболее заметен при сокращении окна, а не увеличивает его. 2 изображения Swapchain (низкая задержка).
[*] Использование представленного режима FIFO (я знаю, что могу использовать почтовый ящик, но подробнее об этом позже).
[*] В идеале я хочу, чтобы содержание окна обновлялось на каждом сообщении wm_size . Я знаю, что могу задержать Swapchain Recreation и повторное использование, обрабатывая 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 , но это чувствует себя неправильно.// 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>
… но это не имеет значения. Независимо от нынешнего режима тяжести и масштабирования, водосточный желоб всегда виден в нижней/справа от окна. Но приложения, интенсивные графики, такие как Blender, имеют очень чистый Resisize. < /P>
Таким образом, вопрос: какой возможный подход для избавления от желоба? Артефакт в двигателе композиции Window (DWM)


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

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

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

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

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

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

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