Как изменить размер окна DirectX без мерцания? - PullRequest
1 голос
/ 11 января 2012

У меня есть простое приложение DirectX, которое отображает некоторые предварительно преобразованные геометрии, и я хочу, чтобы окно не мерцало при изменении его размера, а также я хочу, чтобы рисунки не растягивались с размером окна.

Я заметил проблему растяжения, которая, если я перезагружаю устройство в WM_SIZING, сохраняет фактический размер рисунка. Но сброс устройства каждый раз, когда я изменяю размер окна, кажется дорогой операцией. На самом деле я хотел создать несколько простых графических интерфейсов с использованием DirectX, но изменение размера окна, по-видимому, стирает данные фронтального буфера и, таким образом, приводит к скачкам. Я видел, что многие приложения с пользовательским интерфейсом, использующие opengl, позволяют изменять размеры, а приложение WPF позволяет изменять размеры. Как мне это сделать?

Кроме того, я хотел бы знать, если нет способа добиться эффекта изменения размера в реальном времени без мерцания и изменения положения нарисованных элементов, то как приложения WPF справляются с этим?

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

1 Ответ

3 голосов
/ 12 мая 2012

Я хочу, чтобы окно не мерцало при изменении его размера

Не обрабатывать WM_ERASEBACKGROUND и подобные сообщения.Оставьте всю картину в DirectX, и мерцания не будет.Любое мерцание - это, в основном, вы (или ваши элементы управления), которые сначала рисуют что-то, а затем DirectX рисует поверх него изображение.

, а также я хочу, чтобы рисунки не растягивались с размером окна.

Невозможно (по крайней мере, без хаков).Предполагая, что вы используете DirectX 9, вы должны повторно инициализировать устройство, чтобы изменить его разрешение, и это медленно.

Я могу придумать несколько обходных путей, чтобы попытаться, например, изменить матрицу проекции, чтобы приразрешение в окне просмотра остается тем же (без повторной инициализации), то, что вы видите через окно просмотра, отражает размер окна.

Другими словами, вы устанавливаете область просмотра в 640x480 и сохраняете ее, но если пользователь изменяет размерваше окно должно быть 1024x768, вы упаковываете 1024x768 вещей в ваше окно просмотра 640x480, которое затем растягивается, чтобы заполнить окно 1024x768.

Это должно создать впечатление, что вы «изменяете размер» окна просмотра, но на самом деле этомасштабирование, качество изображения снизится.Вот почему вы можете захотеть переустановить область просмотра в конце, после того, как пользователь закончит с изменением размера окна.Таким образом, вы получаете быстрое изменение размера в первую очередь, а затем качество изображения.

...