Вопрос

При написании приложений DirectX, очевидно, желательно поддержать пользователя, приостановленного приложения через Альт-Вкладка в некотором смысле это быстро и без ошибок. Анкет Какой лучший набор практик для обеспечения этого? Вещи, которые необходимо решить, включают:

  1. Лучшие методы обнаружения, когда ваше приложение было вынесено из альтернатива и когда оно было возвращено.
  2. Какие ресурсы Directx теряются, когда пользователь Alt-Tabs, и лучшие способы справиться с этим.
  3. Основные вещи, которые нужно сделать, и чего следует избегать в архитектуре приложения для целей поддержки Alt-Tab.
  4. Любые существенные различия между основными версиями DirectX, как они применяются к вышеизложенному.

Интересные трюки и Gotchas также приятно слышать.

Это было полезно?

Решение

Я предполагаю, что вы используете C ++ для целей моих ответов, но если вы можете позволить себе использовать C#, xna (http://creators.xna.com/) - отличная игровая платформа, которая решает все эти проблемы для вас.

1]

Эта статья полезна для событий Windows в процедуре окна, чтобы обнаружить, когда окно теряет или получает фокус, вы можете справиться с этим в своем главном окне: http://www.functionx.com/win32/lesson05.htm. Анкет Также ознакомьтесь с сообщением WM_ActivateApp здесь: http://msdn.microsoft.com/en-us/library/ms632614(vs.85).aspx

2]

3]

Я бы позаботился о том, чтобы никогда не отключать alt-tab. Вы, вероятно, хотите минимальную загрузку процессора, в то время как приложение не активно, потому что пользователь, вероятно, Alt-Tabbed, потому что он хочет сделать что-то еще, чтобы вы могли полностью приостановить приложение или уменьшить кадры, отображаемые в секунду. Если приложение минимально, вам, конечно, не нужно ничего делать. Подумав о сетевой игре, мое лучшее решение состоит в том, что вы все равно должны уменьшить кадры, отображаемые в секунду, а также количество обработанных сетевых пакетов, возможно, даже выбрасывая многие пакеты, которые появляются, пока игра не будет повторно активирована.

4]

Честно говоря, я бы просто придерживался DirectX 9.0c (или DirectX 10, если вы хотите ограничить свою целевую операционную систему Vista и более новым), если это вообще возможно :)

Наконец, SDK DirectX имеет многочисленные учебные пособия и образцы: http://www.microsoft.com/downloads/details.aspx?familyid=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en

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

Мы решили его вообще не использовав полноэкранное устройство Directx вообще-вместо этого мы использовали полноэкранное окно с самым максимальным флагом, чтобы скрыть панель задач. Если вы вышли из этого, вы можете снять флаг и минимизировать окно. Ресурсы текстур сохраняются в живых окном.

Тем не менее, этот подход не обрабатывает событие потерянного устройства, происходящее из -за «блокировки экрана», Ctrl+Alt+Delete, удаленного рабочего стола, пользовательского переключения или аналогичного. Но с ними не нужно обрабатывать очень быстро или эффективно (по крайней мере, это имело место в нашем приложении)

Все серьезные приложения D3D должны иметь возможность обрабатывать потерянные устройства, так как это может произойти по разным причинам.

В DX10 под Vista появилась новая функция «Обнаружение и восстановление тайм -аута», которая делает ее обычным опытом для сброса графических устройств, что вызвало бы потерянное устройство для вашего приложения. Кажется, это улучшается по мере взросления водителей, но вам все равно нужно справиться с этим.

В DX8 и 9 (и 10?), Если вы создаете свои ресурсы (в основном буферы и текстуры индекса вершины и индекс), используя d3dpool_managed, они будут сохраняться на потерянных устройствах и не нуждаются в перезагрузке. Это связано с тем, что они хранятся в системной памяти и автоматически копии времени выполнения DX в видео памяти. Однако существует стоимость производительности из -за копирования, и это не рекомендуется для быстро меняющейся вершины. Конечно, вы бы сначала профилировали, чтобы определить, есть ли проблема скорости :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top