2013-10-25 5 views
6

В: C++ приложения \ Win32 (не в полноэкранном режиме) \ DX9окно DirectX9 размер во время выполнения без устройства сброса

Как я могу перерисовывать содержимое окна во время изменения размеров достаточно быстро и красиво? Изменить размер окна пользователя.

Различные подходы:

  • Сброс устройства на каждом WM_SIZE \ WM_PAINT. Адекватное разрешение, но черные полосы появляются на высоких скоростях.
  • Сбросить устройство на WM_EXITSIZEMOVE и сделать паузу на WM_ENTERSIZEMOVE. Лучшая скорость, но до уродливых ~ черных полос во время изменения размера.
  • Невозможно выяснить, как использовать swapchain dx9 в этом случае
  • Сохранять рендеринг и замену буферов во время изменения размера; сбросить WM_EXITSIZEMOVE. Именно то, что происходит в официальных демонстрациях с 2010 SDK. Выглядит быстро и приемлемо. Но [внезапно] на медленных компьютерных черных полосах снова появился. Тонкие и редкие, но настоящие. На самом деле, это очень странно: синхронный рендеринг и Present(,,,) на каждом WM_SIZE и \ или WM_PAINT исключает это на первый взгляд. А на втором. Возможно, я не понимаю что-то важное?

Итак, когда последний метод не удалось, я решил задать здесь. Возможно ли это, как-то сделать поверхность dx9 надежно приклеенной к границе окна. Нет черных полос. Предпочитайте медленную скорость масштабирования вниз, но синхронизируйте ее как-нибудь с DX.

ответ

4

Я выделяю буферный буфер, достаточно большой для максимального размера клиента, и устанавливаю окно просмотра, соответствующее текущему размеру окна окна на WM_SIZE. Затем я выдаю соответственно. присутствовать только в этом окне просмотра. Таким образом, сброс устройства не требуется.

+0

Да, хорошее решение. Я попробую. Но может быть несколько проблем с настройкой нескольких мониторов и мультисэмплированием. – mjollneer

+0

Несомненно. Тем не менее, вы всегда можете указать максимальный размер окна, используя WM_GETMINMAXINFO. Я еще не использовал свое решение с мультисэмплированием. – cdoubleplusgood