В нашей команде мы используем механику рабочего пространства для совместного использования одних и тех же настроек рабочего пространства, помещая файлы предпочтений на общий диск. Небольшое введение можно прочитать здесь .
Я предполагаю, что вы используете 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]
Графическое устройство теряется, когда приложение теряет фокус из полноэкранного режима. Microsoft предлагает статью о том, как с этим справиться: http://msdn.microsoft.com/en-us/library/bb174717 (VS.85). aspx В этой статье также есть руководство по утерянному устройству: http://www.codesampler.com/dx9src/dx9src_6.htm
DirectInput также может иметь состояние ошибки потери устройства, вот ссылка на это : http://www.toymaker.info/Games/html/directinput.html
DirectSound также может иметь состояние ошибки потери устройства, в этой статье есть код, который обрабатывает это: http: // www .eastcoastgames.com / directx / chapter2.html
3]
Я бы никогда не отключал Alt-Tab. Вероятно, вам нужна минимальная загрузка процессора, когда приложение неактивно, потому что пользователь, вероятно, использует Alt-Tab, потому что он хочет сделать что-то еще, чтобы вы могли полностью приостановить приложение или уменьшить количество кадров, отображаемых в секунду. Если приложение свернуто, вам, конечно, тоже ничего не нужно рендерить. Подумав о сетевой игре, мое лучшее решение состоит в том, что вы все равно должны уменьшить количество кадров, отображаемых в секунду, а также количество обрабатываемых сетевых пакетов, возможно, даже отбрасывая многие из входящих пакетов, пока игра не будет повторно активирована.
4]
Честно говоря, я бы просто придерживался DirectX 9.0c (или DirectX 10, если вы хотите ограничить целевую операционную систему Vista и новее), если это вообще возможно :)
Наконец, DirectX sdk содержит множество руководств и примеров: http://www.microsoft.com/downloads/details.aspx?FamilyID=24a541d6-0486-4453-8641-1eee9e21b282&displaylang=en
В DX8 и 9 (и 10?), Если вы создаете свои ресурсы (в основном вершинные и индексные буферы и текстуры) с помощью D3DPOOL_MANAGED, они будут сохраняться на потерянных устройствах и не будут нуждаться в перезагрузке. Это потому, что они хранятся в системной памяти, а среда выполнения DX автоматически копирует в видеопамять. Однако существует снижение производительности из-за копирования, и это не рекомендуется для быстро меняющихся данных вершин. Конечно, сначала вы должны профилировать, чтобы определить, есть ли проблема со скоростью: -)
Все серьезные приложения D3D должны иметь возможность обрабатывать потерянные устройства, поскольку это может происходить по разным причинам.
В DX10 под Vista есть новая функция «Обнаружение и восстановление тайм-аута» "функция, которая, по моему опыту, делает сброс графических устройств обычным явлением, что может привести к потере устройства для вашего приложения. Кажется, что по мере развития драйверов ситуация улучшается, но вы все равно должны с этим справиться.
Мы решили эту проблему, вообще не используя полноэкранное устройство DirectX - вместо этого мы использовали полноэкранное окно с самым верхним флагом, чтобы скрыть панель задач. Если вы нажмете Alt-Tab вне этого, вы можете удалить флаг и свернуть окно. Ресурсы текстуры поддерживаются окном.
Однако этот подход не обрабатывает событие потери устройства из-за «блокировки экрана», Ctrl + Alt + Delete, подключений к удаленному рабочему столу, переключения пользователей и т.п. Но их не нужно обрабатывать очень быстро или эффективно (по крайней мере, так было в нашем приложении)