Библиотеки GDI, GDI+ оказывают огромную помощь при создании красочного окна приложения. Можно не заботиться о совместимости созданного кода с аппаратными средствами компьютера. Предоставляются перья, кисти, регионы, битовые массивы и др. Операционная система Windows сама просчитывает все обращения к графическому устройству компьютера. Очень просто осуществляется настройка контекста устройства. Но в большинстве случаев можно создать эффектные только статические, плоские изображения, а динамично меняющаяся сцена и попытка создать объемность изображения омрачает своей медлительностью и сложностью.
Вот здесь и приходит на помощь DirectX, а точнее ее часть - DirectX Graphics. Библиотеке DirectX подвластны даже объемные изображения. Эти графические изображения и называются более точными названиями, выражающими сущность и мощь DirectX: 3D среда, мировое пространство, трехмерное пространство. На плоском мониторе DirectX творит чудеса, видео-игры завораживают своей реалистичностью. Плата за эту мощь и реалистичность - сложность настройки 3D среды и обеспечения устойчивости работы 3D рендеринга при изменениях настроек приложения и операционной системы.
На устойчивость работы 3D приложения влияют внутренние и внешние факторы. Внутренние факторы в подавляющем большинстве случаев зависят от программиста (что в общем-то не страшно), внешние факторы в основном зависят от пользователя компьютера(и чем "чайней" пользователь, тем серьезней последствия их действий).
Внешние факторы влияющие на устойчивость работы 3D движка рассмотренные в прилагаемом исходном коде:
1. Изменение размеров окна;
2. Изменение режима работы приложения (оконный, полноэкранный);
3. Изменение цветовой глубины пикселя монитора;
4. Переход в спящий/ждущий режим;
5. Обработка потери/восстановления фокуса приложением в полноэкранном режиме.
В Direct3D есть такое понятие - потеря устройства. В нормальном состоянии рендеринг (показ 3D сцены) осуществляется без проблем, при возникновении событий выше перечисленных факторов устройство Direct3D может быть потеряно. Потерянное состояние характеризуется тем, что функции, подготавливающие и осуществляющие рендеринг, возвращают код успеха выполнения, но при этом на экране не отображается 3D сцена. В этом случае нас выручает функция IDirect3DDevice9::Present - при потере устройства ее код возврата равен D3DERR_DEVICELOST. Расшифровка кода возврата D3DERR_DEVICELOST - устройство было потеряно, но не может быть восстановлено в данное время, следовательно, рендеринг невозможен (см. MSDN). Узнать, может быть, устройство восстановлено или нет можно с помощью метода IDirect3DDevice9::TestCooperativeLevel. При возврате кода равного D3DERR_DEVICENOTRESET появляется возможность восстановления устройства.
В случае изменения размеров окна рендеринга, показ 3D сцены не прекращается, но при изменении форматного отношения (ширины окна к высоте) искажаются геометрические пропорции объектов сцены. В данной ситуации необходим "принудительный" сброс устройства и восстановление объектов 3D сцены для сохранения правильных форм.
Представленный ниже исходник, с подробными комментариями, описывает выходы из состояния потери устройства Direct3D и сброс/восстановление объектов 3D сцены. На примере полета сквозь звезды шаг за шагом создается устойчивое 3D приложение с использованием MFC.
| Файл исходника | Количество загрузок | Размер |
| initd3d.rar | 4218 | 175 КБ |
| << Исходник карточной игры девятки на С++ | вверх | Исходный код программы расчета трансформатора >> |
