Единое окно доступа к образовательным ресурсам

Введение в XNA

Голосов: 5

Книга адресована студентам и начинающим разработчикам, которые хотят использовать в своих проектах высокопроизводительную графику. Книга рассчитана на читателей, уже знакомых с основами C# и платформы .NET. Первая глава знакомит читателя с XNA Framework. Вторая глава посвящена визуализации базовых примитивов XNA Framework. В третьей главе рассматриваются более сложные вопросы визуализации: использование полноэкранного режима, плавная анимация примитивов и имитация прозрачности. В четвертой главе весь ранее изученный материал сводится воедино на примере создания полноценного хранителя экрана с дистрибутивом, при необходимости автоматически инсталлирующим на компьютер пользователя XNA Framework. В пятой, заключительной главе затрагивается тема программируемого графического конвейера, но уже на значительно более глубоком уровне; рассматриваются язык HLSL, основы ассемблеро-подобного языка Vertex Shader 1.1 и интегрированная среда разработки FX Composer 2.0, значительно облегчающая разработку и отладку шейдеров. Данная книга входит в состав <a target=_blank href="http://www.microsoft.com/Rus/Msdnaa/Curricula/">"Библиотеки учебных курсов"</a>, формирование которой ведется в рамках программы академического сотрудничества <a target=_blank href="http://www.microsoft.com/rus/msdnaa/">MSDN Academic Alliance (MSDN AA)</a>.

Приведенный ниже текст получен путем автоматического извлечения из оригинального PDF-документа и предназначен для предварительного просмотра.
Изображения (картинки, формулы, графики) отсутствуют.
    Оглавление
Введение ...................................................................................................................................................... 4
   Для кого предназначена эта книга ........................................................................................................ 4
   История написания книги ....................................................................................................................... 4
   Структура книги ....................................................................................................................................... 5
   Требования к программному и аппаратному обеспечению ............................................................... 5
   Описание компакт диска ........................................................................................................................ 5
   Благодарности ......................................................................................................................................... 5
Глава 1. Введение в XNA Framework .......................................................................................................... 6
   OpenGL .................................................................................................................................................... 6
   DirectX .................................................................................................................................................. 7
   Managed DirectX ....................................................................................................................................... 8
   XNA Framework ........................................................................................................................................ 9
   1.1. Создание простейшего приложения, использующего XNA Framework. ...................................11
   1.2. Визуализация шахматной доски. ..................................................................................................18
       1.2.1. Конфигурирование DirectX для отладки приложения. ........................................................20
       1.2.2. Конфигурирование проектов в Visual Studio 2005 ................................................................24
       1.2.3. Изменение размеров окна .....................................................................................................27
   1.2.4. Восстановление работоспособности программы после потери устройства. ........................32
Заключение ................................................................................................................................................33
Глава 2. Визуализация примитивов. ........................................................................................................35
   2.1. Работа с вершинами примитивов. ................................................................................................35
   2.2. Основы визуализации примитивов. .............................................................................................36
   2.3. Введение в HLSL ..............................................................................................................................37
       2.3.1. Графический конвейер............................................................................................................38
       2.3.2. Язык HLSL ..................................................................................................................................40
       2.3.3. Использование эффектов в XNA Framework..........................................................................47
   2.4. Точки (PrimitiveType.PointList). ......................................................................................................52
       2.4.1. Проверка аппаратной поддержки вершинных шейдеров. .................................................58
       2.4.2. Управление размером точек. .................................................................................................60
       2.4.3. Визуализация набора точек....................................................................................................62
       2.4.4. Управление цветом точек средствами HLSL. ........................................................................66
       2.5. Отрезки ........................................................................................................................................71
       2.5.1. Независимые отрезки (PrimitiveType.LineList). .....................................................................71


       2.5.2. Связанные отрезки (PrimitiveType.LineStrip). ........................................................................74
       2.6. Треугольники ..............................................................................................................................81
       2.6.1. Несвязанные треугольники (PrimitiveType.TriangleList) .......................................................81
       2.6.2. Веер треугольников (PrimitiveType.TriangleFan) ...................................................................91
       2.6.3.Полоса из связанных треугольников (PrimitiveType.TriangleStrip) .......................................93
Заключение ..............................................................................................................................................109
Глава 3. Усложненные технологии визуализации. ...............................................................................110
   3.1. Вывод на элементы управления .NET средствами XNA Framework. ........................................110
   3.2. Полноэкранный режим. ...............................................................................................................117
       3.2.1. Выбор оптимального видеорежима. ...................................................................................121
       3.2.2. Получение списка доступных видеорежимов. ...................................................................123
       3.2.3. Диалоговое окно выбора видеорежима. ............................................................................125
   3.3. Анимация. .....................................................................................................................................139
       3.3.1. Использование события Idle.................................................................................................144
       3.3.2. Использование высокоточного таймера Stopwatch. ..........................................................145
       3.3.3 Управление вертикальной синхронизацией........................................................................147
       3.3.4. Замена циклов foreach на for. ..............................................................................................149
       3.3.5. Устранение зависимости движений диска от производительности компьютера. .........153
   3.4. Визуализация полупрозрачных примитивов. ............................................................................154
       3.4.1. Смешивание цветов. .............................................................................................................155
       3.4.2. Использование смешивания цветов для реализации эффекта полупрозрачности. .......157
       3.4.3. Анимация построения фигуры Листажу. .............................................................................159
   Заключение ..........................................................................................................................................162
Глава 4. Хранитель экрана .....................................................................................................................163
   4.1. Реализация вращающегося диска. .............................................................................................164
   4.2. Фейерверк искр. ...........................................................................................................................168
   4.3. Преобразование приложения в хранитель экрана. ..................................................................173
   4.4. Поддержка нескольких мониторов. ...........................................................................................177
   4.5. Диалоговое окно конфигурации хранителя экрана. .................................................................179
       4.5.1. Центрирование диалогового окна относительно Display Properties. ...............................183
   4.6. Визуализация в окне предварительного просмотра.................................................................185
   4.7. Создание дистрибутива. ..............................................................................................................190
       4.7.1. Использование Custom Actions ............................................................................................192
       4.7.2. Интеграция дистрибутивов .NET Framework 2.0 и XNA Framework 1.0 .............................194
   Заключение ..........................................................................................................................................196


Глава 5. Вершинные шейдеры ...............................................................................................................197
   5.1. Математические вычисления в HLSL ..........................................................................................197
       5.1.1. Математические операторы.................................................................................................197
       5.1.2. Работа с компонентами векторов ........................................................................................197
       5.1.3. Математические функции ....................................................................................................198
       5.1.4. Черно-белая закраска ...........................................................................................................199
   5.2. NVIDIA FX Composer 2.0 ................................................................................................................202
       5.2.1. Формат COLLADA 1.4.1...........................................................................................................203
       5.2.2. Знакомство с интерфейсом FX Composer 2.0 ......................................................................205
       5.2.3. Создание нового проекта .....................................................................................................207
       5.2.4. Анализ производительности эффекта. ................................................................................211
   5.3. Введение в языки Vertex Shader .................................................................................................214
       5.3.1. Регистры .................................................................................................................................215
       5.3.2. Команды. ................................................................................................................................220
       5.3.3. Разбираем код простого шейдера .......................................................................................225
   5.4. Передача параметров в эффект ..................................................................................................227
       5.4.1. Работа с параметрами эффектов в XNA Framework ...........................................................230
   5.5. Шейдерный фейерверк ...............................................................................................................232
       5.5.1. Моделирование вращения диска ........................................................................................233
       5.5.2. Оператор if языка HLSL .........................................................................................................243
       5.5.3. Искры ......................................................................................................................................247
       5.5.4. Анализ производительности приложения ..........................................................................263
   Заключение ..........................................................................................................................................264
Заключение ..............................................................................................................................................265


Введение
До недавнего времени создание высокопроизводительных графических приложений для платформы .NET
было весьма нетривиальной задачей. Классические графические API такие как OpenGL и DirectX,
невозможно непосредственно использовать в .NET приложениях, так как их подключаемые файлы
рассчитаны на язык C++. Конвертация этих файлов в сборки .NET тоже не является решением проблемы:
активное использование в API OpenGL и DirectX указателей и специфичных возможностей C++ добавляет
множество головной боли разработчикам, вынуждая активно использовать unsafe-код и нетривиальный
маршалинг, не говоря о том, что на .NET зачастую переводится лишь “ядро” графического API без
вспомогательных библиотек и примеров. Альтернативный вариант с выносом графической подсистемы
приложения в отдельную сборку, разрабатываемую на C++/CLI с использованием родных заголовочных
файлов API, тоже далек от идеала: C++/CLI предъявляет заметно более жесткие требования к квалификации
программиста, но не все компании могут позволить себе нанять таких высокооплачиваемых разработчиков.
Для устранения образовавшегося пробела корпорация Microsoft выпустила XNA – инструментарий
разработки кроссплатформенных игровых приложений для .NET, ориентированный на небольшие команды
разработчиков. В основе XNA лежит библиотека XNA Framework – набор высокопроизводительных
управляемых сборок .NET с множеством классов для работы с видео и аудио подсистемой компьютера, а
так же периферийными устройствами вроде джойстиков. На платформе Windows библиотека XNA
Framework работает через DirectX, но это отнюдь не .NET обертка над COM-объектами DirectX. Местами
некоторые сходства, конечно, прослеживаются, но в целом иерархия классов была значительно
переработана с учетом возможностей платформы .NET, в результате чего XNA Framework стал заметно
проще в использовании. Более того, XNA Framework предоставляет разработчику множество
высокоуровневых средств для использования в приложениях разнообразного контента: изображений,
текстур, моделей, аудио и т.д. и т.п. К тому же классы XNA Framework не завязаны на специфичные
возможности Windows, что позволяет теоретически запускать их на любой платформе, поддерживающей
.NET Framework.
Всѐ это делает XNA очень привлекательным для использования не только в игровых, но и более
“серьѐзных” приложениях, требовательных к производительности видеоподсистемы компьютера:
редакторов уровней, геоинформационных систем, CAD-приложений и т.п. Фактически всѐ, что требуется от
разработчика для получения доступа к возможностям XNA: просто подключить к существующему проекту
сборки XNA Framework. Но есть и небольшая ложка дегтя – использование XNA Framework совместно с
Windows Forms несколько сложнее по сравнению с чисто игровыми приложениями, а текущая документация
XNA Framework практически не содержит информации по такому “нештатному” применению XNA
Framework.

Для кого предназначена эта книга
Я адресую эту книгу студентам и начинающим разработчикам, которые хотят использовать в своих
проектах высокопроизводительную графику. Книга рассчитана на читателей, уже знакомых с основами C# и
платформы .NET.

История написания книги
Изначально я планировал написать книгу под рабочим названием “Профессиональное программирование
трехмерной графики на Managed DirectX 2.0”. Но после детального анализа российского книжного рынка
оказалось, что в России практически отсутствуют книги по Managed DirectX, ориентированные на
начинающих. Иными словами, на российском рынке ещѐ не сформировался спрос на продвинутые книги по
Managed DirectX. Поэтому , не мудрствуя лукаво, я решил написать учебный курс по компьютерной графике
с упором на практическое использование Managed DirectX, после чего перейти к более сложному материалу.
На первых порах всѐ шло по плану, я уже приступил к написанию главы, посвященной моделям освещения,
как среди ясного неба грянул гром: работы над бета версией Managed DirectX 2.0 были прекращены, а
приемником Managed DirectX 2.0 стал XNA Framework. Ситуация была тупиковой. Мне оставалось только
одно: адаптировать материал для XNA Framework. Однако после детального знакомства с XNA Framework
оказалось, что он значительно отличается от Managed DirectX, поэтому адаптированная книга получилась
бы очень посредственной, что-то вроде книг по Visual C++ .NET, в которых собственно .NET посвящена
одна последняя глава.
В конце концов, я решился начать писать с нуля новую книгу по XNA Framework, но, к сожалению, из-за
жесткого дефицита времени удалось написать только первые 5 глав, а после моего переезда в Москву
написание книги окончательно встало. Честно говоря, я долго думал, стоит ли издавать незаконченную
книгу, но после общения с читателями “бета-версий” глав пришел к выводу, что в условиях дефицита


русскоязычной литературы по XNA Framework убирать этот уникальный материал в чулан было бы в
высшей степени неразумно.

Структура книги
Как говорилось выше, книга состоит из пяти глав. Первая глава знакомит читателя с XNA Framework. В ней
рассматривается подключение XNA Framework к проекту Visual Studio, визуализация на поверхности
формы и корректная обработка изменений размеров окна.
Вторая глава посвящена визуализации базовых примитивов XNA Framework. Так как в XNA отсутствует
фиксированный графический конвейер, в ней так же затрагиваются основы программируемого графического
конвейера. В третьей главе рассматриваются более сложные вопросы визуализации: использование
полноэкранного режима, плавная анимация примитивов и имитация прозрачности. В четвертой главе весь
ранее изученный материал сводится воедино на примере создания полноценного хранителя экрана с
дистрибутивом, при необходимости автоматически инсталлирующим на компьютер пользователя XNA
Framework.
Пятая глава начинает следующий виток спирали, но уже на более детальном уровне. Здесь снова
затрагивается тема программируемого графического конвейера, но уже на значительно более глубоком
уровне; рассматриваются язык HLSL, основы ассемблеро-подобного языка Vertex Shader 1.1 и
интегрированная среда разработки FX Composer 2.0, значительно облегчающая разработку и отладку
шейдеров.

Требования к программному и аппаратному обеспечению
Все примеры книги были созданы в Visual Studio 2005 Pro SP1, однако для запуска большинства примеров
вполне достаточно и Visual C# 2005 Express SP1. Так как XNA Framework не поддерживает фиксированный
графический конвейер, видеокарта должна обязательно иметь аппаратную поддержку пиксельных шейдеров
хотя бы версии 1.1. Аппаратная поддержка вершинных шейдеров не требуется, так что примеры книги
корректно работают даже на интегрированных видеокартах Intel GMA 9xx.

Описание компакт диска
Компакт диск, прилагаемый к книге, содержит следующие каталоги:
 DOC – документация, на которую имеются ссылки в тексте книги.
 Examples – проекты примеров книги, сгруппированные по главам.
 NVIDIA – IDE для разработки шейдеров NVIDIA FX Composer 2.0.
 Tools
          o Debug View – утилита Марка Руссиновича для просмотра отладочных сообщений.
          o .NET Reflector – известная утилита для дизассемблирования сборок .NET.
          o RightMark 3D – утилита для тестирования производительности видеокарт.
 Visual C# 2005 Express – требуется для корректной установки XNA Game Studio 1.0 Express.
 Visual C# 2005 Express SP1 – обновления для Visual C# 2005 Express.
 XNA Game Studio Express 1.0 – версия XNA, используемая примерами книги.
 XNA Game Studio 2.0 – текущая версия XNA Game Studio.
Для компиляции примеров книги необходимо установить Visual C# 2005 Express, Visual C# 2005 Express
SP1 и XNA Game Studio Express 1.0, после чего скопировать папку Examples на локальный диск, не забывая
снять с еѐ содержимого атрибут read only.

Благодарности
В ходе работы над книгой мне приходилось общаться с людьми, которые давали мне ценные советы и
оказывали моральную поддержку. Я бы хотел поблагодарить: Алексея Кряжева (Codemasters Software),
Игоря Рыбинского (BHV), Филиппа Герасимова (NVIDIA), Андрея Крючкова (Microsoft), Александра
Ложечкина (Microsoft), Олега Михайлика, Евгения Маркова (NVIDIA), Кирилла Дмитриева (NVIDIA),
Михаила Фарленкова (XNA Dev), Романа Никитина, Викторию Жислину (Intel) и Николая Семенова (стажер
Intel, СПбГУАП). Отдельная благодарность выражается Геннадию Ригеру (AMD), Юрию Уральскому
(NVIDIA) и Дмитрию Набойченко (SolarWind), оказавшим неоценимую помощь при написании книги.


Глава 1. Введение в XNA Framework
Первые версии Windows позволяли программисту работать с видеоподсистемой
компьютера лишь посредством стандартного интерфейса GDI, предоставляющему
программисту   унифицированный   доступ   к   различным   устройствам   вывода
графической информации будь то видеокарта, принтер или плоттер. Интерфейс GDI
очень прост в использовании – приложение работает с некоторым виртуальным
устройством, а GDI самостоятельно транслирует все вызовы приложения в команды
конкретной видеокарты или принтера. Преимущества данного подхода очевидны.
Например, добавив в приложение всего несколько строк кода, вы можете с
легкостью перенаправить вывод с экрана монитора на принтер и получить нужный
результат. Кроме того, работа с виртуальным устройством не позволяет
некорректно   написанному  приложению   нанести   какой-либо  ощутимый   ущерб
стабильности операционной системе и повредить данные других приложений.
Как всегда, недостатки интерфейса GDI являются продолжением его достоинств.
Любому человеку, даже поверхностно знакомому с устройством персонального
компьютера, ясно, что, к примеру, видеокарта NVIDIA GeForce 5900 Ultra и
лазерный принтер Canon Laser Shot LBP-1120 являются абсолютно разными
устройствами. Соответственно, при проектировании универсального интерфейса
для   работы    с   данными    устройствами неминуемо   придѐтся   жертвовать
эффективностью. Это не особо критично для офисных приложений, работающих с
достаточно простыми изображениями и не требовательных к скорости обновления
экрана. Однако для целого класса приложений (игры, системы виртуальной
реальности,   пакеты   3D   моделирования), критичных  к   производительности
видеоподсистемы компьютера, накладные расходы GDI оказались неприемлемыми. В
результате разработчики этих приложений не стремились переносить свои
разработки с DOS на Windows, что отнюдь не способствовало росту популярности
операционной системы Windows.

OpenGL
Так как операционная система без развлекательных приложений вряд ли смогла бы
добиться   широкой популярности   среди   домашних  пользователей,  Microsoft
включала сначала в Windows NT 3.5, а затем и в Windows 95 OSR2 поддержку
OpenGL – известного кроссплатформенного       API для разработки трехмерных
графических приложений реального времени. В те времена OpenGL справедливо
считался флагманом индустрии трехмерной графики реального времени. Тем не
менее, у него все же был ряд недостатков:
 Так как OpenGL предназначен исключительно для работы с графикой, он решил
  лишь проблемы низкой производительности графической подсистемы Windows.
  Работа   с   аудиоподсистемой  компьютера  по-прежнему   осуществлялась   с
  использованием стандартного медленного интерфейса MCI1. Аналогичным образом
  обстояли дела и с получением информации от устройств ввода: клавиатуры,
  мыши и джойстиков.
 OpenGL является кросплатформенным API, не привязанным к операционной
  системе. В результате в нем отсутствуют какие-либо средства для создания
  окон, загрузки текстур и моделей из файлов и т.д., так как реализация
  данной функциональности неминуемо бы ограничила переносимость этого API.
  Подобные    особенности   несколько    усложняют   разработку приложений,
  предназначенных исключительно для платформы Windows.
 OpenGL является полностью открытым API, не имеющим единого хозяина.
  Развитие OpenGL координируется наблюдательным комитетом по архитектуре
  (ARB), в который входят ведущие лидеры индустрии, такие как Intel,
  Microsoft, AMD, NVIDIA, SGI, 3D Labs, Evans & Sutherland и т.д. Такое число
  участников зачастую приводит к конфликтам внутри комитета, последствия
  которых хорошо описаны в известной басне И.А. Крылова “Лебедь, рак и щука”.

1
 Media Control Interface – интерфейс управления мультимедийными устройствами. Содержит набор
стандартных команд, позволяющих осуществлять воспроизведение и запись файлов мультимедийных
ресурсов. Информацию о MCI можно найти, к примеру, в [К.4].


    Кроме того, использование открытого API, пускай и лучшего в индустрии, в
    качестве одного из краеугольных компонентов, мягко говоря, не отвечает
    интересам политики Microsoft.
Поэтому нет ничего удивительно в том, что параллельно с интеграцией OpenGL в
Windows, Microsoft работала над собственным API для разработки мультимедийных
приложений.

DirectX
Первым игровым API, разработанным Microsoft, стал, стал WinG [С.1]. Это был
достаточно примитивный API предназначенный для работы исключительно с
двухмерной графикой реального времени в операционных системах Windows 3.1 и
Windows 95. Видеорежимы с количеством цветов более 256 не поддерживались.
Единственным преимуществом WinG была более высокая производительность, чем у
GDI. Впрочем, на фоне DOS и OpenGL 1.1 оно выглядело весьма спорным.
После неудачи с WinG стало ясно, что Microsoft вряд ли сможет в одиночку в
короткие сроки разработать конкурентоспособный API для программирования
графических приложений реального времени. В результате было принято решение
купить британскую компанию RenderMorfics и перенести еѐ библиотеку Reality Lab на платформу
Windows. Так появился Game SDK, позже переименованный в DirectX.
Из-за сжатых сроков Microsoft не смогла создать на основе Reality Lab полноценный масштабируемый API с
заделом на будущее, в результате чего на рынке началась настоящая чехарда версий DirectX, для получения
представления о масштабах которой достаточно посмотреть на частоту появления новый версий DirectX
(таблица 1.1). Нетрудно заметить, что каждый год выходило не менее одной версии DirectX, причѐм новая
версия содержала множество кардинальных изменений, в результате чего оказывалась несовместимой с
более старой версией. Положение стабилизировалось лишь в 2002-м году с выходом 9-й версии DirectX. С
тех пор были выпущены лишь три новых редакции DirectX с незначительными изменениями, после чего
Microsoft перешла к выпуску обновлений к DirectX, устраняющих мелкие недочеты, в темпе одно
обновление каждые два месяца.
      П р им еч а н ие
      Любопытно, что графическая подсистема DirectX смогла достичь функциональность OpenGL 1.1
      (существовавшего ещѐ до появления DirectX) лишь к 7-й версии. Впрочем, к 9-й версии возможности OpenGL и
      DirectX сравнялись, после чего наметилась тенденция к технологическому отставанию OpenGL от DirectX.

                                                      Таблица 1.1. Даты выхода версий DirectX

Версия DirectX                                         Дата выхода
DirectX 1.0                                            1995
DirectX 2.0                                            1996
DirectX 3.0 / 3.0a                                     1996
DirectX 5.0 / 5.1 / 5.2                                1997-1998
DirectX 6.0 / 6.1                                      1998-1999
DirectX 7.0 / 7.0a / 7.1                               1999
DirectX 8.0 / 8.1                                      2000-2001
DirectX 9.0 / 9.0a / 9.0b / 9.0c +                     2002-2006
Updates


Что представляет собой DirectX? Это высокопроизводительная мультимедийная библиотека для
программирования приложений требовательных к производительности видеоподсистемы, аудиосистемы и
системы ввода-вывода компьютера. В основе DirectX лежит набор COM2-интерфейсов, предоставляющих
программисту доступ к аппаратному обеспечению компьютера. Эти интерфейсы разработаны Microsoft в
тесном сотрудничестве с ведущими производителями аппаратных устройств, таких как Intel, ATI, NVIDIA,

2
 Component Object Model – модель компонентных объектов. Определяет стандарты интерфейсов API и
бинарные стандарты для связи объектов, не зависящих от языка программирования. Каждый объект COM
имеет один или несколько интерфейсов, представляющих собой таблицы функций, связанных с этим
объектом. В продаже и свободном доступе имеется множество литературы, посвящѐнной COM, начиная с
[К.9] и заканчивая MSDN.


Creative и т.д. Поэтому интерфейсы DirectX очень близки к современному аппаратному обеспечению и
фактически связаны с аппаратным обеспечением через тонкую прослойку драйверов, минуя стандартные
интерфейсы Win32, такие как GDI и MCI.
В DirectX 9 интерфейсы сгруппированы в три специализированных компонента 3 (рисунок 1.1):
 DirectX Graphics, отвечающий за работу с двухмерной и трѐхмерной графикой.
 DirectInput, предназначенный для работы с устройствами ввода: мышью, клавиатуры, джойстиками с
  обратной связью и т.п.
 DirectSound, используемый для работы со звуковым оборудованием: звуковыми картами, в том числе и с
  поддержкой трѐхмерного звука, MIDI-синтезаторами и т.п.




Рисунок 1.1. Упрощѐнная схема взаимодействия приложения с устройствами при использовании DirectX


Managed DirectX
После выхода платформы .NET Framework встал вопрос об использование трехмерной графики в
приложениях, написанных на управляемых языках вроде C#. Дело в том, что COM-интерфейсы
компонентов DirectX проектировались в расчѐте на использование в программах на языке C++, в результате
чего они активно используют специфические возможности C++, к примеру, указатели. Поэтому, хотя язык
C# и позволяет использовать COM-компоненты, применение интерфейсов DirectX в программах на C#
сопряжено с рядом проблем: применение же указателей в C# не приветствуется и является плохим тоном
программирования на платформе .NET, указатели могут использоваться только в unsafe-блоках, что
затрудняет чтение программы и повышает вероятность ошибок. Вдобавок, COM-компоненты не могут
использовать преимущества инфраструктуры .NET такие как автоматическая сборка мусора и обработка
ошибок с использованием исключений.
Чтобы облегчить жизнь разработчикам приложений для платформы .NET, Microsoft включила в состав 9-й
версии DirectX надстройку над COM-интерфейсами DirectX: Managed DirectX. В октябре 2005 года была
анонсирована вторая версия Managed DirectX, которая была фактически переписана с нуля с учѐтом новых
возможностей платформы .NET 2.0, в частности, Managed DirectX стал активно использовать обобщенные
(Generic) классы.
Managed DirectX 2.0 является тонкой надстройкой над DirectX, размещѐнной в сборке Microsoft.DirectX.dll.
Сборка Microsoft.DirectX.dll удовлетворяет всем требованиям платформы .NET 2.0 и не привязана к
конкретному языку программирования. Соответственно она может с одинаковой лѐгкостью использоваться
в любой .NET-совместимом языке программирования вроде Microsoft Visual Basic, Microsoft Visual C#,
Microsoft Visual J#, Iron Python и т.п. Как и оригинальный DirectX, Managed DirectX состоит из трѐх
компонентов: Direct3D Graphics, DirectInput и DirectSound. Каждому компоненту соответствует одно или
несколько пространств имѐн (таблица 1.2), содержащих классы и структуры данного компонента. При этом


3
 В действительности в составе DirectX имеется ещѐ четыре компонента: DirectDraw (работа с двухмерной
графикой), DirectMusic (проигрывание фоновой музыки), DirectPlay (работа с сетью) и DirectShow
(проигрывание видеофайлов). Однако эти компоненты не рекомендуются к использованию, так как они
объявлены устаревшими и по видимости будут исключены из будущих версий DirectX.


хорошо прослеживается соответствие между классами DirectX и соответствующими COM-интерфейсами
неуправляемого DirectX. К примеру, COM-интерфейсу IDirect3D9 соответствует брат-близнец класс
Microsoft.DirectX.Direct3D.Device, интерфейсу IDirect3DTexture9 – класс Microsoft.DirectX.Direct3D.Texture
и так далее. Более того, при должной сноровке при изучении Managed DirectX вполне можно пользоваться
документацией по C++ и наоборот4.
                                                             Таблица 1.2. Пространства имѐн Managed DirectX 2.0

Пространство имѐн                         Соответствующий компонент           Описание
                                          DirectX
Microsoft.DirectX                         Используется всеми компонентами     Содержит базовый набор классов,
                                          DirectX                             общий для всех      компонентов:
                                                                              векторы, матрицы, кватернионы и
                                                                              т.п.
Microsoft.DirectX.Generic                 Используется всеми компонентами     В    этом   пространстве   имѐн
                                          DirectX                             расположены   все    обобщѐнные
                                                                              классы
Microsoft.DirectX.Direct3D                DirectX Graphics                    Отвечает за работу с 3D графикой
Microsoft.DirectX.Direct3D.CustomVertex   DirectX Graphics                    Содержит    структуры         типовых
                                                                              форматов вершин
Microsoft.DirectX.DirectInput             DirectInput                         Работа с устройствами ввода
Microsoft.DirectX.XInput                  DirectInput                         Работа с устройствами           ввода
                                                                              игровой приставки XBOX
Microsoft.DirectX.DirectSound             DirectSound                         Работа со звуком, в том числе и
                                                                              трѐхмерным.


Однако Beta версия Managed DirectX 2.0 не была доведена до Release, став частью значительно более
амбициозного проекта XNA Framework.

XNA Framework
В 2005-м году в продажу поступила игровая приставка Microsoft следующего поколения – XBOX 360. На
этот раз Microsoft решила отказаться от использования процессоров привычной архитектуры x86 в пользу
процессора PowerPC, не совместимого с x86. Сама архитектура игровой приставки так же значительно
отличалась от персонального компьютера, работающего под управлением операционной системы Windows.
Таким образом, впервые в истории у Microsoft оказалось две несовместимых игровых платформы: Windows
и XBOX 360. Это обстоятельство ощутимо осложнило жизнь разработчикам игр, так как написание
приложения с поддержкой обоих платформ фактически сводится к написанию отдельных приложений для
каждой платформы, что под силу лишь достаточно крупным конторам.
Подобная изоляция двух платформ не устраивала Microsoft, поэтому возникла необходимость создания
инструментария позволяющего небольшим конторам и начинающим разработчикам создавать
кроссплатформенные приложения, работающие как на платформе Windows, так и на XBOX 360. В качестве
основы было решено использовать платформу .NET: как известно, .NET-приложения компилируются в
промежуточный язык IL, а финальная компиляция в машинный код происходит только при запуске
приложения на конкретной системе. Таким образом, .NET-приложению, в общем-то, безразлично, какой
процессор в данный момент установлен в системе.
Но на практике все оказалось несколько сложнее:
1. .NET Framework содержит мощную библиотеку классов на все случаи жизни, включая разработку
   приложений баз данных, web-сервисов, web-сайтов. Разумеется, данная функциональность является,
   мягко говоря, несколько избыточной для игровой приставки. Кроме того, ряд классов .NET Framework
   сильно привязаны к операционной системе Windows (пространства имен System.Windows.Forms,
   System.Drawings), а перенос Windows на игровую приставку является весьма сомнительной затеей.
2. Managed DirectX, является достаточно тонкой настройкой над DirectX. А так как DirectX – это один из
   компонентов платформы Windows, Managed DirectX автоматически оказывается непереносимым API,
   привязанным к платформе Windows. Кроме того, классы и структуры Managed DirectX активно
   используют функциональность из пространств имен System.Windows.Forms и System.Drawing.
4
 Это очень важный нюанс, так как в настоящее время классический DirectX содержит гораздо более
подробную документацию.


Первая проблема была решена путѐм реализации на XBOX лишь подмножества классов .NET Framework,
известного как .NET Compact Framework. Для решения второй проблемы был разработан XNA Framework –
высокопроизводительный кроссплатформенный API для разработки графический приложений для платформ
Windows и XBOX 360.
Условно все компоненты XNA Framework можно разделить на 4 уровня абстракции (рисунок 1.2):
 Platform (Платформа) – самый нижний уровень, содержащий платформо-зависимые API, такие как
  неуправляемый DirectX. В подавляющем большинстве случаев приложение может нечего не знать о
  существовании этого уровня, используя компоненты более высоких уровни абстракции. Более того,
  прямое обращение уровню Platform неминуемо сузит диапазон платформ, поддерживаемых
  приложением: не исключено, что Microsoft в будущем добавит поддержку XNA Framework и в
  операционные системы для карманных устройств.
 Core Framework (Основной Каркас) – нижний платформо-независимый уровень XNA, обеспечивающий
  базовую функциональность. Размещается в сборке Microsoft.Xna.Framework.dll и содержит 5
  компонентов: Graphics (работа с графикой), Audio (работа со звуком), Input (работа с устройствами
  ввода-вывода), Math (математические расчеты), Storage (работа с файловой системой). Классы и
  структуры каждого компонента сгруппированы в пространства имен (таблица 1.3). На платформе
  Windows первые три компонента (Graphics, Audio, Input) являются надстройками над DirectX, а
  компонент Storage – надстройкой над классами .NET Framework для работы с файловой системой.
  Однако следует всегда помнить о том, что на других платформах всѐ может обстоять совершенно иначе.
 Extended Framework (расширенный каркас) – набор высокоуровневых классов, решающих типовые
  задачи, встающие перед разработчиком игр: инициализация графического устройства, организация цикла
  обработки сообщений, экспорт моделей и текстур из графических редакторов. По сути Extended
  Framework можно считать универсальным игровым движком (Game Engine) начального уровня.
  Размещается в сборке Microsoft.Xna.Framework.Game.dll.
 Game – собственно приложение пользователя, то есть наши с вами программы. К слову, в комплект XNA
  входит несколько простых игр (Starter Kits), которые можно использовать в качестве заготовок для своих
  приложений.



                                       Games




                                            Extended Framework
                                        (Microsoft.Xna.Framework.Game.dll)
                                Компоненты: Application Model, Content Pipeline




                                        Core Framework
                                    (Microsoft.Xna.Framework.dll)
                        Компоненты: Graphics, Audio, Input, Math, Storage




                                      Platform
              Компоненты: Direct3D, XACT, XINPUT, XContent и т.д.

Рисунок 1.2. Уровни XNA Framework

                                               Таблица 1.3. Пространства имен сборки Microsoft.Xna.Framework.dll

Пространство имен                                Соответствующий        Назначение
                                                 компонент XNA
Microsoft.Xna.Framework                          Math                   Математические расчеты: матричная алгебра,
                                                                        аналитическая     геометрия,     проверка
                                                                        столкновений и т.д. В Managed DirectX эта
                                                                        функциональность (в урезанном виде)



    
Яндекс цитирования Яндекс.Метрика