Лучшие практики для поддержки Alt-Tab в приложении DirectX? - PullRequest
38 голосов
/ 10 июня 2009

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

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

Об интересных трюках и хитах тоже приятно слышать.

Ответы [ 4 ]

43 голосов
/ 10 июня 2009

Я предполагаю, что вы используете 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 и новее), если это вообще возможно:)

Наконец, DirectX SDK содержит множество учебных пособий и примеров: http://www.microsoft.com/downloads/details.aspx?FamilyID=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en

2 голосов
/ 17 июня 2009

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

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

2 голосов
/ 17 июня 2009

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

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

1 голос
/ 16 июня 2009

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

...