Подтвердить что ты не робот

Лучшие практики поддержки Alt-Tab в приложении DirectX?

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

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

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

4b9b3361

Ответ 1

Предполагаю, что вы используете С++ для моих ответов, но если вы можете позволить себе использовать С#, 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]

  • Графическое устройство теряется, когда приложение теряет фокус из полноэкранного режима. Microsoft предлагает статью о том, как с этим справиться: http://msdn.microsoft.com/en-us/library/bb174717(VS.85).aspx В этой статье также есть утерянный урок устройства: <а4 >

  • DirectInput также может иметь состояние с потерянным устройством, вот ссылка на это: http://www.toymaker.info/Games/html/directinput.html

  • DirectSound также может иметь состояние с ошибкой устройства, в этой статье есть код, который обрабатывает: http://www.eastcoastgames.com/directx/chapter2.html

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

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

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

Ответ 3

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

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

Ответ 4

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