(Начало в №17)
DirectX 10 и Managed DirectX
Итак, уважаемые дамы и господа, а также все прочие, продолжим разговоры о сложном, но увлекательном процессе разработки компьютерных игр. Сейчас я буду отдавать долги и расскажу о том, о чём давно уже обещал рассказать. В общем, не буду долго затягивать вступление - перейду сразу к рассказу.
Managed DirectX
Поскольку о Managed DirectX рассказ обещает получиться более коротким, вначале расскажу о нём. Хотя... как знать, может быть, повествование и затянется.
Думаю, большая часть читателей так или иначе знакома или хотя бы слышала о существовании такой вещи, как Microsoft .NET. Суть её заключается в том, что приложения, написанные для .NET Framework, компилируются не в команды процессора напрямую, а в промежуточный специализированный код, который в последующем программа, называемая виртуальной машиной, транслирует в обычный машинный код и передаёт на выполнение процессору. Очевидно, это усложняет и замедляет процесс запуска программ, зато они становятся хорошо совместимыми с разными операционными системами и имеют меньше конфликтов между собой. С точки зрения разработчика .NET тоже вовсе не худшая платформа, поскольку она объектно-ориентирована и позволяет многие вещи писать очень быстро.
К чему было это лирическое отступление? А к тому, что Managed DirectX - это API DirectX для приложений, создаваемых с помощью .NET. На первый взгляд, идея создавать приложения, работающие с быстрой графикой, на .NET абсурдна. Ведь, как уже говорилось, использование виртуальной машины тормозит работу .NET-приложений, по сравнению с обычными. Однако на самом деле всё не так уж плохо. Во-первых, виртуальная машина .NET очень быстрая, и поэтому пользователь, запускающий у себя .NET-приложение, зачастую даже и не подозревает о её присутствии. Во-вторых, всё в этом мире можно оптимизировать. Платформа .NET позволяет писать код на Ассемблер-подобном языке, управляющем низкоуровневыми инструкциями виртуальной машины. Ну, а в-третьих, стоит вспомнить, что работа DirectX напрямую связана с COM - технологией, когда-то считавшейся тоже достаточно медленной. Поскольку с некоторых пор Managed DirectX - не просто надстройка над обычными COM-объектами, представляющими API DirectX, а полноценная реализация на коде платформы .NET, то замедление работы оказывается практически незаметным.
Managed DirectX состоит из одной сборки (на платформе .NET термин "сборка" в большинстве случаев обозначает аналог DLL-библиотеки из Windows). Это Microsoft.DirectX.dll. В ней размещаются различные пространства имён. Microsoft.DirectX содержит все основные базовые классы, без которых невозможна работа DirectX-приложений. Microsoft.DirectX.Generic, в принципе, тоже. Microsoft.DirectX.Direct3D содержит все функции Direct3D API, но только уже для .NET, Microsoft.DirectX.DirectInput содержит классы для работы с устройствами ввода (в случае приложений для приставки Xbox оно меняется на Microsoft.DirectX.XInput), а Microsoft.DirectX.DirectSound отвечает за работу со звуком. Полной аналогии с "нормальным" DirectX, как видите, нет: отсутствуют компоненты для работы с потоковым мультимедиа, а также для сетевого взаимодействия приложений. Но, что касается последнего, отсутствие DirectPlay с лихвой компенсируется другими компонентами платформы .NET.
Чем хорош Managed DirectX, по сравнению с обычным? Тем, что его удобно использовать в многоязыковых проектах (имеются в виду те, которые пишутся одновременно на нескольких разных языках программирования). Кроме того, он более удобен для начинающих разработчиков, как удобна и сама платформа .NET, поскольку позволяет использовать все преимущества ООП, не обращая внимания на распределение памяти, тонкости работы COM и прочие отвлекающие от GameDev'а моменты. Для написания приложений с использованием Managed DirectX вполне достаточно того же самого DirectX SDK, который используется для работы с обычным DirectX.
"Десятка"
Поскольку разработка игры требует достаточно значительного вложения времени и средств, лучше всё планировать наперёд и пользоваться такими технологиями, которые ещё некоторое время не устареют. И чем дольше не устареют, тем, конечно же, лучше. Поэтому лучше заранее ориентироваться на самые перспективные технологии. Именно поэтому я расскажу вам сейчас немного о DirectX 10-й версии.
Десятая версия самой популярной в мире игровой библиотеки работает официально только под Windows Vista. Правда, энтузиасты перенесли её (не вполне законно, конечно) под Windows XP и даже, по слухам, Linux. Но ежели вы планируете от своей разработки получать какой-нибудь доход, то лучше не заикаться о том, что вы можете заставить свою игру, использующую DirectX 10, работать под чем-то, кроме Vista.
Кроме проблемы совместимости с операционной системой, есть ещё такая проблема, как аппаратное обеспечение - в просторечии, "железо". И если как-то подправить сам DirectX для работы под Windows XP хакеры ещё могут, то перепаивать видеокарты вряд ли под силу кому-то, кроме их производителей.
Из всего этого сразу следует вывод: три раза подумайте, прежде чем использовать DirectX 10! Видите, какое интересное кино получается: нужно ориентироваться на самые передовые технологии, но при этом не забывать о том, что для большинства пользователей они пока ещё не доступны.
Но, тем не менее, несмотря на всё это, есть довольно-таки много положительных моментов. Только для того, чтобы пояснить их, придётся сначала рассказать о том, что такое шейдеры.
Шейдер - это программа, описывающая параметры геометрии объекта. В общем случае шейдер описывает поглощение и рассеяние света, наложение текстур, отражение, затенение и вообще всё, что угодно. Шейдеры пишутся на специальных языках, встроенных в движки рендеринга (отрисовки) трёхмерных изображений. Именно благодаря шейдерам появилась возможность создавать фотореалистичную трёхмерную графику при сравнительно небольших затратах на разработку приложений, её использующих. Однако именно благодаря тому, что каждая точка объекта рассчитывается автономно, шейдеры требуют огромных вычислительных мощностей от компьютера. В DirectX шейдеры описываются с помощью языков DirectX ASM (низкоуровневое описание) и HLSL (высокоуровневое). Традиционно в DirectX существовало разделение шейдеров на пиксельные и вершинные. Они имеют разные функции, разные возможности по манипуляции изображениями.
Правда, в 10-й версии всё изменилось. Пришли коммунисты и всех уравняли: теперь нет ни богатых шейдеров, ни бедных, ни вершинных, ни пиксельных. То есть, в DirectX 10 все шейдеры стали универсальными. Кроме того, кроме шейдеров, ничего не осталось, то есть все фиксированные методы и функции, отвечавшие за формирование трёхмерных объектов, канули в Лету. Теперь балом правят шейдеры и никто кроме них. В общем-то, уже одного этого вполне достаточно, чтобы понять, что десятая версия DirectX претендует на революционность. И, надо сказать, претензии эти вполне обоснованны.
Но пугаться не нужно. Все программы, использующие старую шейдерную модель, также смогут успешно взаимодействовать с DirectX 10. Но, конечно, того же качества рендеринга при этом добиться вряд ли удастся. Обеспечивается же качество не только тем, что шейдеры стали унифицированными, но и тем, что их стало значительно больше. Десятая версия DirectX позволяет использовать при рендеринге сцены до 64000 шейдерных инструкций, а размер двухмерных текстур увеличился в пределе до 8000х8000 пикселов.
Но, конечно, одними шейдерами нововведения в графической системе не ограничились. Появился, например, потоковый вывод обработанного шейдерами изображения. Оно не отрисовывается напрямую, а записывается в выделенный буфер видеопамяти. И дальше с ним можно делать всё, что угодно, опять-таки, ещё ДО его отрисовки. Это должно положительно сказаться на производительности игр. Текстуры теперь получили расширенные права и могут "складироваться" в массивы. Единственный минус в том, что их не отличишь по типу данных от шейдеров, и это может приводить к ошибкам в процессе разработки. Также в DirectX 10 внедрена новая версия высокоуровневого шейдерного языка HLSL 10. HLSL расшифровывается как High Level Shader Language, по своей структуре он похож на C. Также в 10-й версии DirectX внедрена новая система создания 3D-эффектов - FX 10. Она создана специально для просчёта сложных эффектов в режиме реального времени.
С точки зрения разработчика, конечно, DirectX 10 более удобен, чем 9-я версия, поскольку накладывает на него меньше ограничений. Но пользователю могут не понравиться системные требования игры, главное из которых - Windows Vista + ультрамощная видеокарта. Но, с другой стороны, вполне может статься, что к тому моменту, как ваша игра будет закончена, у всех уже будет и Vista, и достойный видеоадаптер, так что в настоящий момент вопрос "быть или не быть" (то есть, "10 или 9") определяется, в первую очередь, предполагаемыми сроками разработки проекта. Если они достаточно велики, то можно вполне использовать и DirectX 10. Если же игра не очень большая, то, может быть, и не стоит гнаться за максимальным качеством изображения, а постараться заинтересовать пользователя чем-нибудь другим. Например, сюжетом.
Что касается шейдеров, то на них, конечно, стоило бы остановиться подробнее, но статья и так уже довольно большая, а главного редактора никто не отменял. Так что о них как-нибудь, может быть, потом.
Вадим СТАНКЕВИЧ
Горячие темы