Direct draw термины и концепции дополнительные интерфейсы directdraw


Содержание

Direct draw термины и концепции дополнительные интерфейсы directdraw

Для работы с книгой необходимо иметь Windows NT 4.0 или Windows 95. Кроме того, потребуется Visual C++ 5.0 или более поздней версии.

Вам также понадобится собственно DirectX версии 3a или выше (желательно DirectX 5). Учтите, что DirectX распространяется в двух видах: в runtime-варианте и в SDK. Runtime-вариант часто устанавливается программами, использующими DirectX, он также встроен в операционную систему Windows NT 4.0. На CD-ROM этой книги содержатся runtime-компоненты DirectX 5. С другой стороны, пакет DirectX SDK необходим для компиляции программ, написанных для DirectX. Он отсутствует на CD-ROM этой книги, однако его можно бесплатно скачать по адресу: www.microsoft.com/msdownload.

Вам потребуется компьютер с процессором Pentium и выше. Под Windows NT необходимо иметь 32 Мбайт RAM, а под Windows 95 — не менее 16 Мбайт. Общий принцип остается прежним — чем больше, тем лучше. Также потребуется дисковод CD-ROM.

Наконец, понадобится видеокарта, поддерживаемая библиотекой DirectDraw (на данный момент DirectDraw поддерживают практически все современные видеокарты).

Пора заняться делом. Начнем с краткого курса DirectDraw.

Глава 1. Краткий курс DirectDraw

Полностью рассмотреть в одной главе всю библиотеку DirectDraw было бы нереально. В конце концов, даже о простейших аспектах DirectDraw написаны целые книги. DirectDraw представляет собой мощный и гибкий API, с помощью которого можно создать практически любое графическое приложение Windows. Именно гибкость существенно усложняет любые описания. Следовательно, было бы глупо пытаться рассмотреть все, от начала до конца, в одной главе.

И все же я решил попробовать.

Позвольте мне для начала рассказать о том, чего в этой главе не будет. Несомненно, вам уже приходилось слышать о DirectDraw. Наверняка вы видели демонстрационные программы и игры, написанные на базе этой библиотеки. Я избавлю вас от длинной тирады о светлом будущем графики в Windows. Хорошо написанное приложение DirectDraw говорит само за себя, поэтому мы обойдемся без охов и ахов.

Кроме того, я пропускаю многословные рассуждения о HAL (Hardware Abstraction Layer, прослойка абстрактной аппаратуры), HEL (Hardware Emulation Layer, прослойка эмуляции аппаратуры) и все кошмарные диаграммы, которые встречаются в справочных файлах SDK и некоторых книгах по DirectDraw. Вы читаете эту книгу, чтобы освоить программирование для DirectDraw, а не потому, что собираетесь писать драйверы устройств DirectDraw или изучать тонкости внутреннего устройства библиотеки.

В этой главе мы поговорим о практическом применении DirectDraw с точки зрения программиста. Прежде всего мы разберемся с тем, что же такое DirectDraw, и перейдем к обсуждению DirectDraw API. После этого будут рассмотрены некоторые практические вопросы, несомненно представляющие интерес при программировании для DirectDraw.

Что такое DirectDraw?

Весьма интересное определение DirectDraw можно найти у одного из его самых яростных противников — FastGraph. Графический пакет FastGraph появился уже довольно давно. В настоящее время существует версия FastGraph, которая поддерживает DirectDraw, но скрывает DirectDraw API за своим собственным нестандартным API. Тед и Диана Грубер (Ted and Diana Gruber), создатели и поставщики FastGraph, разместили на своем Web-узле файл, в котором доказывается, что FastGraph лучше DirectDraw.

В числе прочих доводов Груберы заявляют, что DirectDraw представляет собой «просто механизм блиттинга». Такая формулировка оказывается довольно точной, но чрезмерно упрощенной. Правильнее было бы сказать, что DirectDraw — аппаратно-независимый механизм блиттинга, наделенный некоторыми возможностями программной эмуляции. Главная задача DirectDraw как раз и заключается в том, чтобы по возможности быстро и надежно копировать графические изображения в память видеоустройств (блиттинг).

DirectDraw можно рассматривать и с другой точки зрения — как менеджер видеопамяти. DirectDraw распределяет блоки памяти и следит за состоянием каждого блока. Программы могут по своему усмотрению создавать, копировать, изменять и уничтожать такие блоки, причем конкретные подробности этих операций остаются скрытыми от программиста. Такое описание тоже оказывается излишне упрощенным. Во-первых, DirectDraw может использовать не только видеопамять, но и обычную память (RAM). Кроме того, при проектировании менеджеров памяти основное внимание обычно уделяется надежности, а не быстродействию. При проектировании же DirectDraw главной целью было именно быстродействие.

С технической точки зрения DirectDraw представляет собой переносимый API в сочетании с набором драйверов устройств. В своей работе DirectDraw полностью обходит традиционный графический механизм Windows (интерфейс графических устройств, GDI). GDI завоевал дурную славу своим низким быстродействием, поэтому независимость от него крайне важна для достижения оптимальной скорости.

Термины и концепции

Приняв к сведению все эти описания DirectDraw, давайте познакомимся с некоторыми терминами и концепциями, составляющими неотъемлемую часть используемого жаргона. Мы начнем с простейших, но основных понятий, которые относятся к графике вообще, а затем перейдем к специфике DirectDraw.

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается отдельная память, не входящая в основную память компьютера. Память, установленную на видеокарте, мы будем называть видеопамятью , а обычную память (RAM) — системной памятью . Объем памяти, необходимой для поддержки определенного видеорежима, определяется разрешением и глубиной пикселей в этом режиме. Например, для видеорежима 640×480×8 (640×480 пикселей, каждый из которых имеет глубину в 8 бит) требуется 307300 байт. Видеорежим 1024×768×16 требует 1572864 байт. Для поддержки видеорежимов используется видеопамять. Следовательно, режимы, поддерживаемые конкретной видеокартой, ограничиваются объемом установленной видеопамяти. Скажем, режим 1024×768×16 не поддерживается видеокартами с 1 Мбайт памяти, потому что для него такой объем памяти недостаточен.

Одна из ключевых возможностей DirectDraw — переключение видеорежимов. Она позволяет приложению DirectDraw обнаружить и активизировать любой режим, поддерживаемый установленной видеокартой. Переключение режимов подробно рассматривается в главе 4.

Основная причина, по которой DirectDraw обеспечивает оптимальное быстродействие, состоит в том, что во всех возможных случаях применяется аппаратное ускорение. Это означает, что видеокарта выполняет некоторые операции с помощью встроенных в нее аппаратных средств. Аппаратное ускорение обладает двумя основными преимуществами. Во-первых, в нем используются средства, спроектированные специально для ускорения графических операций. Тем самым обеспечивается максимальная скорость выполнения всех действий. Во-вторых, аппаратное ускорение освобождает процессор компьютера от необходимости выполнения этих операций, благодаря чему процессор может заняться другими задачами.

Поверхностью (surface) в DirectDraw называется прямоугольная область памяти, обычно содержащая графические данные. Блок памяти, изображающий поверхность, может находиться как в системной, так и в видеопамяти. Хранение поверхностей в видеопамяти обычно повышает скорость работы программы, поскольку большинство видеокарт не может обращаться к системной памяти напрямую.

«Графика для Windows средствами DirectDraw»: Стэн Трухильо 1
Предисловие 1
Введение 1
Для чего написана эта книга 1
Требования к читателю 1
Программные требования 2
Аппаратные требования 2
Глава 1. Краткий курс DirectDraw 2
Что такое DirectDraw? 2
Спецификация COM фирмы Microsoft 4
DirectDraw API 4
Интерфейсы DirectDraw и DirectDraw2 4
Интерфейсы DirectDrawSurface 6
Интерфейс DirectDrawPalette 8
Интерфейс DirectDrawClipper 8
Дополнительные интерфейсы DirectDraw 8
Структуры DirectDraw 8
Создание приложений DirectDraw 9
Подготовка инструментов 9
Глава 2. Проблемы быстродействия 10
Глава 3. За кулисами DirectDraw 12
DirectDraw AppWizard 12
Создание приложения Bounce 13
Структура приложения 13
Инициализация DirectDraw 14
Создание поверхностей 16
Графический вывод 18
Оконные приложения 20
Глава 4. Видеорежимы и частота смены кадров 21
Переключение видеорежимов 21
Обнаружение видеорежимов и частот смены кадров 22
Вычисление FPS 23
Графический вывод 24
Обработка пользовательского ввода 25
Частота смены кадров 26
Глава 5. Поверхности и форматы пикселей 28
Поверхности 28
BMP-файлы 31
Программа BmpView 34
Глава 6. DirectInput 38
Что такое DirectInput? 38
DirectInput API 39
Программа Qwerty 40
Инициализация DirectInput 40
Управление версией DirectInput 42
Программа Smear 42
Глава 7. Проблема курсора 44
Частичное обновление экрана 44
Многопоточность 45
Решение проблемы курсора 46
Программа Cursor 47
Глава 8. Воспроизведение видеороликов 50
Начальные сведения 50
Программа AviPlay 52
Глава 9. Проверка столкновений 55
Общее решение 55
Функции проверки столкновений 56
Класс Sprite 57
Программа Bumper 59
Приложение А. Информация для разработчиков 60
Отладка 60
Замечания о Visual C++ 64
Советы и рекомендации 66

Лучшие электронные книги в формате fb2
Наш портал – это библиотека интересных электронных книг разнообразных жанров. Здесь вы найдете произведения как российских, так и зарубежных писателей. Все электронные книги, представленные на нашем сайте, можно скачать бесплатно. Наша библиотека содержит только лучшие бесплатные электронные книги, ведь каждую электронную книгу мы тщательно изучаем перед добавлением в базу. Мы выбираем интереснейшие произведения в удобном формате fb2, все они достойны вашего внимания. Чтение электронных книг наверняка принесет вам удовольствие. Всё что, что вам нужно сделать, — найти и скачать книгу, которая понравится вам по заголовку и описанию.
Библиотека fb2-электронных книг – полезнейшее изобретение человечества. Для того чтобы, читать книгу, вам нужно просто загрузить ее с нашего сайта. Вы можете наслаждаться чтением, не совершая лишние траты. Электронная книга, в отличие от бумажной, обладает множеством преимуществ. Вы экономите время и силы, не совершая утомительные походы по магазинам. Вам также не нужно обременять себя ношением тяжеловесной макулатуры. Скачать и читать электронную книгу легко и просто . Мы позаботились о том, чтобы вам всегда было что почитать. Электронная книга fb2 принесет вам море положительных эмоций: она способна поделиться с вами мудростью, поднять настроение или просто скрасить досуг.

Direct draw термины и концепции дополнительные интерфейсы directdraw

Приняв к сведению все эти описания DirectDraw, давайте познакомимся с некоторыми терминами и концепциями, составляющими неотъемлемую часть используемого жаргона. Мы начнем с простейших, но основных понятий, которые относятся к графике вообще, а затем перейдем к специфике DirectDraw.

Видеорежимы

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается отдельная память, не входящая в основную память компьютера. Память, установленную на видеокарте, мы будем называть видеопамятью, а обычную память (RAM) — системной памятью. Объем памяти, необходимой для поддержки определенного видеорежима, определяется разрешением и глубиной пикселей в этом режиме. Например, для видеорежима 640×480×8 (640×480 пикселей, каждый из которых имеет глубину в 8 бит) требуется 307300 байт. Видеорежим 1024×768×16 требует 1572864 байт. Для поддержки видеорежимов используется видеопамять. Следовательно, режимы, поддерживаемые конкретной видеокартой, ограничиваются объемом установленной видеопамяти. Скажем, режим 1024×768×16 не поддерживается видеокартами с 1 Мбайт памяти, потому что для него такой объем памяти недостаточен.

Одна из ключевых возможностей DirectDraw — переключение видеорежимов. Она позволяет приложению DirectDraw обнаружить и активизировать любой режим, поддерживаемый установленной видеокартой. Переключение режимов подробно рассматривается в главе 4.

Аппаратное ускорение

Основная причина, по которой DirectDraw обеспечивает оптимальное быстродействие, состоит в том, что во всех возможных случаях применяется аппаратное ускорение. Это означает, что видеокарта выполняет некоторые операции с помощью встроенных в нее аппаратных средств. Аппаратное ускорение обладает двумя основными преимуществами. Во-первых, в нем используются средства, спроектированные специально для ускорения графических операций. Тем самым обеспечивается максимальная скорость выполнения всех действий. Во-вторых, аппаратное ускорение освобождает процессор компьютера от необходимости выполнения этих операций, благодаря чему процессор может заняться другими задачами.

Поверхности

Поверхностью (surface) в DirectDraw называется прямоугольная область памяти, обычно содержащая графические данные. Блок памяти, изображающий поверхность, может находиться как в системной, так и в видеопамяти. Хранение поверхностей в видеопамяти обычно повышает скорость работы программы, поскольку большинство видеокарт не может обращаться к системной памяти напрямую.

Поверхности делятся на несколько типов. Простейшими являются внеэкранные (off-screen) поверхности. Внеэкранная поверхность может находиться как в видеопамяти, так и в системной памяти, но не отображается на экране. Такие поверхности обычно используются для хранения спрайтов и фоновых изображений.

Первичная (primary) поверхность, напротив, представляет собой участок видеопамяти, отображаемой на экране. Любая программа DirectDraw, обеспечивающая графический вывод, имеет первичные поверхности. Первичная поверхность должна находиться в видеопамяти.

Первичные поверхности часто бывают составными (complex), или, что то же самое, переключаемыми (flippable). Переключаемая поверхность может участвовать в переключении страниц — операции, при которой содержимое всей поверхности мгновенно отображается на экране с помощью специальных аппаратных средств. Переключение страниц используется во многих графических программах как с поддержкой DirectDraw, так и без, поскольку оно обеспечивает очень гладкую анимацию и устраняет мерцание. Переключаемая первичная поверхность на самом деле состоит из двух поверхностей, одна из которых отображается на экране, а другая — нет. Невидимая поверхность называется вторичным буфером (back buffer). При переключении страниц поверхности меняются местами: та, которая была вторичным буфером, отображается на экране, а та, что ранее отображалась, превращается во вторичный буфер.

Как внеэкранные, так и первичные поверхности делятся на две разновидности: палитровые (palettized) и беспалитровые (non-palettized). Палитровая поверхность вместо конкретных значений цветов содержит индексы в цветовой таблице, которая называется палитрой. В DirectDraw палитровыми являются только 8-битные поверхности. Поверхности с глубиной пикселей, равной 16, 24 и 32 битам, являются беспалитровыми. Вместо индексов в них хранятся фактические значения цветов.


Поскольку в каждом пикселе беспалитровой поверхности находятся реальные цветовые данные, необходимо знать, в каком формате хранятся отдельные пиксели поверхностей. Формат пикселя описывает способ хранения красной, зеленой и синей (RGB) составляющих. Он зависит от глубины пикселей, видеорежима и аппаратной архитектуры. Форматы пикселей подробно рассматриваются в главе 5.

Блиттинг

На жаргоне, принятом в компьютерной графике, «блиттингом» называется операция копирования. Примером типичного блиттинга служит копирование внеэкранной поверхности во вторичный буфер. Если аппаратное ускорение невозможно, DirectDraw эмулирует блиттинг на программном уровне. Такая эмуляция справляется

Direct draw термины и концепции дополнительные интерфейсы directdraw

DirectDraw® — это часть выпущенного компанией Microsoft программного продукта Microsoft® DirectX® 5 Software Development Kit (SDK). Для тех из вас, кто живет на необитаемых островах, скажу, что DirectX 5 SDK — последняя версия инструмента разработчика, изначально называвшаяся Game SDK. DirectX 5 SDK содержит набор динамически подключаемых библиотек (DLL) для ускорения операций с графикой, сервисы для работы с 3D, ускорение обработки звука, расширенные функции связи, функции для работы с джойстиком и CD-ROM.

Хотя тем для описания в DirectX 5 SDK очень много, в этой статье я собираюсь рассказать, как начать программировать графическую часть игры с помощью DirectDraw. Этот процесс относительно прост, хотя и требует незначительных познаний интерфейсов OLE и Component Object Model (COM). Однако, не паникуйте. Вся информация, которую вам нужно знать об OLE и COM, будет изложена в статье.

После прочтения этой статьи вы будете в состоянии написать простую игру с использованием DirectDraw. Однако в статье рассматриваются лишь основные моменты программирования DirectDraw. В примерах рассматриваются только полноэкранные режимы с переключением страниц. Я не собираюсь рассказывать о применении DirectDraw в окне, наложениях текстур на 3D поверхность, использования видеоклипов на поверхностях DirectDraw, или как рендерить поверхности с использованием DirectDraw. Если вы интересуетесь этими темами, можно почитать документацию по DirectX 5. (Документация DirectX 5 находится в библиотеке MSDN™ в разделе Platform SDK/Graphics and Multimedia Services.)

Требования DirectX 5 SDK

DirectX 5 SDK может работать как под платформой Windows® 95, так и Windows NT® 5.0. Далее предполагается, что вы используете IBM-PC–совместимый компьютер под управлением Windows 95. Плюс, для программирования, компилирования, и запуска программ, использующих DirectDraw, вам нужен инсталлированный DirectX 5 SDK. Вы можете скачать SDK по адресу http://www.microsoft.com/directx/resources/devdl.htm. DirectX 5 SDK также распространяется через библиотеку MSDN (только для подписчиков уровня Professional или выше).

Также предполагается, что у вас есть C или C++ компилятор, способный откомпилировать 32-битное приложение, и что у вас есть достаточный запас знаний по программированию на C или C++. Возможно использование других языков программирования для работы с DirectX 5 SDK, но в статье они не рассматриваются. Также вам необходимы познания в программировании под Windows.

Если вы используете компилятор C, вам необходимо проинсталлировать Win32® SDK. Win32 SDK содержит библиотеки, которые нужны вам, чтобы создать исполняемые файлы из примеров, поставляемых с DirectX 5 SDK.

DirectDraw API

DirectDraw — одна из компонент DirectX 5 SDK. DirectDraw был создан для быстрой работы; библиотека позволяет получить доступ к оборудованию на самом нижнем уровне, исключая многочисленные надстройки, обычно связанные с программированием Windows-based графики. Это делает DirectDraw идеальным средством для программирования игр, где самое главное — быстрый вывод графики на экран.

Но, конечно, основное преимущество DirectDraw — это то, что предоставляется одинаковый (общий) интерфейс к видеоадаптерам различных производителей Вам не нужно беспокоиться о том, на каком оборудовании будет работать ваша программа. DirectDraw использует информацию, находящуюся на абстрактном аппаратном уровне (HAL — Hardware Abstraction Level) для определения возможностей видеоадаптера. (Информация HAL — забота производителя видеоадаптера.) HAL определяет общий интерфейс между видеоадаптерами различных производителей и приложением, использующим DirectDraw.

Однако, DirectDraw не ограничивает вас только аппаратными возможностями видеоадаптера. Если вашей игре нужно специфичное оборудование или поддержка специфичных функций, а такого оборудования нет или функция не поддерживается, ваше приложение будет использовать уровень эмуляции аппаратуры (HEL — Hardware Emulation Level), включенный в DirectDraw. В этом случае DirectDraw использует встроенную эмуляцию для «создания» тех условий, которые требуются. Конечно, у HEL есть свои недостатки, в основном связанные с быстродействием. Этот вопрос будет рассмотрен позже, в статье Determining the Capabilities of the Display Hardware.

Следующий рисунок показывает связь между DirectDraw и графическими компонентами Windows:

Рисунок 1. Связь между DirectDraw и графическими компонентами Windows

API DirectDraw состоит из объекта DirectDraw, который представляет собой индивидуальный адаптер дисплея. Кроме того, API содержит объект DirectDrawSurface, который представляет собой поверхность, объект DirectDrawPalette, представляющий палитру поверхности, и объект DirectDrawClipper, представляющий список клипов. Объект DirectDraw можно использовать для создания объектов DirectDrawSurface и DirectDrawPalette. (Также с помощью объекта DirectDraw можно создать объект DirectDrawClipper, однако обычно DirectDrawClipper создают независимо.) Единственные объекты, нужные для создания игр — DirectDraw, DirectDrawSurface, и DirectDrawPalette.

Для понимания, как работают эти объекты вам нужны некоторые знания по технологии OLE и ее интерфейсу COM. Интерфейс COM — базис всего программирования DirectDraw. Если вы уже знакомы с OLE, вы можете пропустить следующий раздел, где будет рассказано, что вам нужно знать об OLE.

DirectDraw, OLE, и интерфейс COM

DirectDraw был спроектирован на основе OLE и интерфейса COM. Если вы не знакомы с программированием OLE начало программирования DirectDraw может показаться вам очень трудным. Хотя много бумаги ушло на многотомовые издания книг об OLE и интерфейсе COM, для программирования DirectDraw вам нужно знать всего лишь несколько вещей.

Для начала, дадим определение OLE и инетрфейсу COM. OLE — это объектно-ориентированная технология, разработанная Microsoft для совместного использования информации процессами. COM — Component Object Model (компонентная объектная модель) — интерфейс, используемый при программировании OLE. Теперь, когда вы знаете эти определения, можете их забыть — они не используются в программировании. Вместо этого давайте изучим самый минимум, который необходимо знать об интерфейсе COM, чтобы использовать DirectDraw.

Илон Маск рекомендует:  Dd определение данных

В основном, интерфейс COM основан на трех составляющих: объектах, интерфейсах и методах. Объект — по существу, черный ящик. Вам не нужно знать ничего об устройстве этого объекта, так как все, что вам нужно для взаимодействия с этим объектом, заключено в интерфейсе. Суть взаимодействия через интерфейс — использование методов. Образно объект можно представить в виде интегральной микросхемы (для тех, кому ближе аппаратная часть). Взаимодействие с микросхемой(объектом) заключается в подаче и снятии электрических сигналов (методы) с выводов микросхемы (интерфейс).

Все интерфейсы COM выводятся из интерфейса IUnknown OLE. Интерфейс IUnknown поддерживает жизненный цикл объекта DirectDraw. В дополнение, он определяет доступные интерфейсы данного объекта. Интерфейс IUnknown состоит из трех методов: AddRef , Release , и QueryInterface .

AddRef и Release ответственны за хранение числа ссылок на интерфейс. Когда создается экземпляр объекта, число ссылок устанавливается в 1. Если какая-нибудь функция возвращает указатель на интерфейс, ассоциированный с этим объектом, функция должна вызывать метод AddRef для увеличения числа ссылок на 1. (Если другое приложение обращается к этому объекту, число ссылок также увеличивается. Для нашей статьи это уточнение не имеет значение, так как только одно приложение будет использовать наши объекты.)

Когда вы завершили использование интерфейса, вы должны вызвать метод Release для уменьшения числа ссылок на 1. Для того, чтобы удалить из памяти объект, число ссылок должно равняться 0. Как только число ссылок объекта равняется 0, он удаляется и все его интерфейсы становятся «неправильными» (invalid).

Третий метод IUnknown , QueryInterface , запрашивает объект о поддержке определенного интерфейса. Если интерфейс поддерживается, QueryInterface возвращает указатель на этот интерфейс.

Как методы AddRef , QueryInterface , и Release связаны с DirectDraw? Во-первых, нет причин использовать AddRef или QueryInterface в простых играх, использующих только DirectDraw. Функции, создающие различные типы объектов DirectDraw должны заботиться об увеличении числа ссылок и возвращении указателей на интерфейсы. Вам неоходимо выполнить Release для каждого неявно созданного указателя. Если эти требования не выполнять, ваши программы будут заканчиваться с «утечкой памяти». В следующих примерах я покажу как все делается. (Вам понадобится использовать AddRef и QueryInterface, если ваша программа использует объекты DirectDraw, уже используемые другим приложением. Если вы используете Direct3D, необходимо использовать QueryInterface для возврата указателя на интерфейс Direct3D. Оба эти случая находятся за пределами рассмотрения данной статьи.)

Теперь давайте посмотрим на пример кода на C, использующего метод интерфейса IDirectDraw :

ddrval = lpDD->lpVtbl->SetDisplayMode( lpDD, ScreenX, ScreenY, ScreenBpp );

В этой строчке кода вы используете метод SetDisplayMode для установки видеорежима и получения результата этой операции (успешно/неудачно). Это не так важно. Важно то, как получается указатель на метод, который вы используете. Вы не можете получить прямой доступ к методам интерфейса IDirectDraw . Когда создается экземпляр объекта, создается таблица виртуальных функций, называемая vtable, которая содержит указатели на все методы интерфейса. Единственная возможность вызвать методы интерфейса — использовать указатели из этой таблицы. В предыдущем примере указатель на объект DirectDraw (lpDD)указывает на указатель, содержащий адрес таблицы vtable (lpVtbl), которая в свою очередб содержит указатели на все методы объекта—в нашем случае это метод SetDisplayMode . Связь между нашим приложением и интерфейсом объекта представлена на следующем рисунке:

Следующий пример показывает, как сделать то же с использованием C++:

ddrval = lpDD->SetDisplayMode( ScreenX, ScreenY, ScreenBpp );

Заметим, что указатель на vtable явно больше не используется. Указатель на vtable неявный, и C++ автоматически подставляет lpDD как первый параметр. Указатель this больше не нужен, так как С++ вызывает метод относительно, используя указатель на текущий объект (в нашем случае, lpDD).

Если вы хотите узнать больше об OLE и интерфейсе COM, можете почитать книгу «Inside OLE» (автор Kraig Brockschmidt, MSDN Library/Books/Inside OLE). Это лучшая книга, объясняющая как работают OLE и COM. Я рекомендую прочитать первую главу и половину второй для хорошего понимания принципов функционирования интерфейса COM. Это поможет понять связи между DirectDraw и интерфейсом COM (если вы не поняли моих объяснений).

Начало работы с DirectDraw

Я отмечал ранее, что вам нужно проинсталлировать на компьютер DirectX 5 SDK. Также вам нужно проинсталлировать компилятор C или C++. Предположим, вы используете Microsoft Visual C++® версии 5.0 и вы проинсталлировали компилятор и SDK в каталоги по умолчанию. Если вы используете другой компилятор или проинсталлировали SDK в другой каталог на жестком диске, вам нужно внести соответствующие изменения в примеры, приведенные ниже.

Так как моя цель — показать основы программирования DirectDraw, давайте используем некоторые элементарные примеры, поставляемые с DirectX 5 SDK. Они показывают, как инициализировать DirectDraw и использовать методы DirectDraw. Просмотрев эти примеры, вам будет легче понять более сложный пример игры, находящийся на CD DirectX 5 SDK.

Но перед началом работы нужно настроить окружение компилятора для работы с DirectX 5 SDK. Как это сделать, зависит от того, как вы используете Visual C++ для компиляции примеров. Я покажу вам правильную настройку в случае использования Microsoft Developer Studio, или при использовании утилиты NMAKE из командного режима.

Настройка Microsoft Developer Studio

Для тех из вас, кому нравится работать с удобным графическим интерфейсом, Visual C++ предлагает Microsoft Developer Studio. Для начала компилирования примеров из DirectX 5 SDK, вам нужно создать новый проект, подключить к нему несколько файлов и настроить окружение таким образом, чтобы компилятор нашел нужные библиотеки и включаемые файлы. Рассмотрим по пунктам, что же нужно сделать для того, чтобы откомпилировать первый пример, DDEX1.

Открыв Microsoft Developer Studio создайте новый проект:


  1. В меню File , выберите New .
  2. В диалоге New , выберите закладку Project .
  3. Из списка Projects , выберите Win32 Application .
  4. В поле Location можно выбрать путь к каталогу, содержащему проект.
  5. В поле Project name , введите DDEX1 .
  6. Нажмите OK . Появится новая папка DDEX1 Classes в левой части окна.

Для подключения к проекту файлов проделайте следующие действия:.

  1. В меню Project выберите пункт Add To Project и кликните Files . Появится диалог Insert Files into Project .
  2. Откройте каталог DXSDK\SDK\SAMPLES\DDEX1. Выберите все файлы с расширением CPP. Нажмите OK .
  3. Откройте панель FileView для просмотра файлов, подключенных к проекту.
  4. Для просмотра списка файлов в папке DDEX1, нажмите на + слева от надписи DDEX1.

Следующие шаги описывают, как назначить директорию, из которой будут браться включаемые файлы.

  1. В меню Tools выберите Options . Появится диалог Options .
  2. Выберите закладку Directories .
  3. В списке Show Directories For выберите категорию файлов Include .
  4. В поле Directories , дважды щелкните на пустую строку в конце списка, и введите C:\DXSDK\SDK\LIB .
  5. Нажмите Enter .
  6. В поле Directories , дважды щелкните мышью на последней (пустой) строке и введите C:\DXSDK\SDK\SAMPLES\MISC.
  7. Выделите строку C:\DXSDK\SDK\LIB. Нажимайте Move Item Up в поле Directories пока строка C:\DXSDK\SDK\LIB не станет самой верхней строкой.
  8. Выделите строку C:\DXSDK\SDK\SAMPLES\MISC. Нажимайте Move Item Up в поле Directories пока строка C:\DXSDK\SDK\SAMPLES\MISC не станет второй (прямо после строки C:\DXSDK\SDK\LIB).
  9. Нажмите OK .

Выбираем каталог, где находятся библиотеки.

  1. В списке Show Directories For , выберите категорию файлов Library .
  2. В поле Directories , дважды щелкните на самую нижнюю пустую строку и введите C:\DXSDK\SDK\LIB .
  3. Нажмите Enter .
  4. Выделите строку C:\DXSDK\SDK\LIB. Нажимайте Move Item Up в поле Directories пока строка C:\DXSDK\SDK\LIB не станет самой верхней строкой.
  5. Нажмите OK .

Наконец, подключаем нужные библиотеки:

  1. В меню Project выберите пункт Settings . Появится диалог Project Settings .
  2. Выберите закладку Link .
  3. Из выпадающего списка Category выберите General .
  4. В списке Object/library modules добавьте Ddraw.lib и Winmm.lib.
  5. Нажмите OK .

Вы наверное удивляетесь, почему C:\DXSDK\SDK\INC, C:\DXSDK\SDK\SAMPLES\MISC и C:\DXSDK\SDK\LIB нужно двигать в самый верх поля Directories . Это нужно из-за того, что Visual C++ версии 5.0 уже содержит все библиотеки и включаемые файлы от DirectX 3. Чтобы быть увереным, что используются файлы DirectX 5, мы вынуждены поставить их самыми первыми в списке. В этом случае Visual C++ 5.0 найдет эти файлы первыми и не будет использовать старые файлы DirectX 3.

Многие операции, проделанные нами только что будут повторяться в дальнейших проектах.

Настройка путей для утилиты NMAKE

Если вам (как и мне) нравится утилита командной строки NMAKE, то вам нужно прописать пути к каталогам, содержащим библиотеки и включаемые файлы DirectX 5. Так как в Visual C++ 5.0 используются длинные имена, то нужно проделать дополнительную работу, чтобы зставить NMAKE работать нормально. Я дам вам несколько подсказок, чтобы вы представляли, что нужно сделать.

  1. Первое, что нужно сделать — это изменить файл Vcvars32.bat, находящийся в каталоге C:\Program Files\DevStudio\VC\bin. Здесь нужно прописать некоторые переменные окружения, определяющие как вы используете C++. (К примеру, если вы переписали все каталоги с установочного диска C++ на жесткий диск, то нужно закоментировать все строки, ссылающиеся на CD-ROM)
  2. Затем необходимо создать .BAT- файл, который будет содержать все, необходимое для работы с DirectX 5:

1. @echo off
2. set INCLUDE=%INCLUDE%;C:\DXSDK\SDK\INC
3. set LIB=%LIB%;C:\DXSDK\SDK\LIB

  1. Затем необходимо увеличить объем памяти, выделяемый под переменные окружения окна MS-DOS® (спасибо новым длинным именам в Visual C++ 5.0). Для этого выполните в окне MS-DOS следующую команду:

1. command /E:1000

что добавит тысячу байт к уже выделенному объему. Заметим, что эту строку надо выполнить первой в окне MS-DOS, так как все установки переменных окружения, выполненные до этой команды будут потеряны.

  1. Зпаустите Vcvars32.bat для установки переменных окружения Visual C++ 5.0.
  2. Наконец, запустите .BAT — файл, который вы создали на шаге 2 DirectX 5.

Для того, чтобы откомпилировать какой-нибудь пример зайдите в каталог, его содержащий (C:\DXDSK\SDK\SAMPLES\DDEX4, например) и введите:

В каталоге, в котором вы находитесь создастся папка DEBUG и туда поместится откомпилированный исполняемый файл.

Начальный размер памяти, выделяемый под переменные окружения окна MS-DOS в Windows 95 можно изменить следующим образом:

  1. В настройках меню Пуск Windows найдите «MS-DOS Prompt».
  2. Щелкните на иконке правой кнопкой и выберите Properties .
  3. Выберите закладку Memory и измените значение Initial на 1024.

Основы DirectDraw (DDEX1)

Для использования DirectDraw сначала нужно создать экзепляр объекта DirectDraw object, который будет представлять адаптер дисплея, а затем использовать методы интерфеса. Также необходимо создать один или несколько экземпляров объекта DirectDrawSurface для отображения вашей игры.

Для демонстрации посмотрим, как DDEX1 из DirectX 5 SDK создает объект DirectDraw, затем создает основную поверхность и затем переключается между поверхностями.

Замечание Файлы примера DDEX написаны на C++. Если вы используете компилятор C, вам нужно модифицировать файлы чтобы они откомпилировались. (По крайней мере, вам нужно добавить vtable и указатель this для методов интерфейса.)

Инициализация DirectDraw

Инициализация DirectDraw в примере DDEX1 содержится в функции doInit .

/*
* Создаем основной объект DirectDraw.
*/
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
if( ddrval == DD_OK )
<
// Get exclusive mode.
ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
if(ddrval == DD_OK )
<
ddrval = lpDD->SetDisplayMode( 640, 480, 8 );
if( ddrval == DD_OK )
<
// Создаем основную поверхность.
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP |
DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if( ddrval == DD_OK )
<
// Получаем указатель на бэк-буфер.
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps,
&lpDDSBack);
if( ddrval == DD_OK )
<
// Напишем текст.
if (lpDDSPrimary->GetDC(&hdc) == DD_OK)
<
SetBkColor( hdc, RGB( 0, 0, 255 ) );
SetTextColor( hdc, RGB( 255, 255, 0 ) );
TextOut( hdc, 0, 0, szFrontMsg,
lstrlen(szFrontMsg) );
lpDDSPrimary->ReleaseDC(hdc);
>
if (lpDDSBack->GetDC(&hdc) == DD_OK)
<
SetBkColor( hdc, RGB( 0, 0, 255 ) );
SetTextColor( hdc, RGB( 255, 255, 0 ) );
TextOut( hdc, 0, 0, szBackMsg,
lstrlen(szBackMsg) );
lpDDSBack->ReleaseDC(hdc);
>
// Создаем таймер для переключения страниц.
if( SetTimer( hwnd, TIMER_ID, TIMER_RATE, NULL ) )
<
return TRUE;
>
>
>
>
>
>

wsprintf(buf, «Direct Draw Init Failed (%08lx)\n», ddrval );

Каждый из проделанных шагов необходим для создания объекта DirectDraw, а созданием и подготовкой поверхности мы займемся в следующих разделах.


Создание объекта DirectDraw

Для создания экземпляра объекта DirectDraw ваше приложение может использовать функцию API DirectDrawCreate . (Заметим, что я употребил слово «может».Есть по-крайней мере еще одна возможность создания объекта DirectDraw — с использованием функции OLE CoCreateInstance — но это не обсуждается в данной статье).В DirectDrawCreate передается глобальный идентификатор (GUID) который определяет устройство вывода и в большинстве случаев он устанавливается в NULL (что говорит о том, что используется устройство вывода по умолчанию), адрес указателя, определяющий местонахождение создаваемого объекта DirectDraw, и третий параметр всегда устанавливается в NULL (используется для будущих расширений).

Следующий пример показывает, как создавать объект DirectDraw и определять, удачно ли завершилась эта операция:

Введение в Microsoft DirectX

Microsoft DirectX — это набор низкоуровневых программных интерфейсов, используемых для управления рядом аппаратных компонентов компьютера. В состав этих интерфейсов входят: DirectDraw — для быстрого доступа к видеопамяти, DirectSound — для вывода аудиоинформации на звуковую карту, DirectPlay — для организации многопользовательской работы через модем, локальную сеть или Internet, DirectInput — для обработки ввода информации с клавиатуры, от мыши или джойстика и Direct3D — ядро поддержки трехмерной графики, используемое совместно с DirectDraw.

Основная цель, которую преследовала фирма Microsoft, создавая интерфейс DirectX, — превратить компьютеры, работающие под управлением операционной системы Windows, в идеальную платформу для приложений, богатых мультимедийными элементами: полноцветной графикой, видеофрагментами, трехмерной анимацией и стереозвуком. Встроенный непосредственно в ядро операционной системы Microsoft Windows, интерфейс DirectX является интегрированным сервисом Windows 98 и Windows 2000, а также Microsoft Internet Explorer. Компоненты DirectX могут быть автоматически загружены на ваш компьютер при установке современных игр и мультимедийных приложений, разработанных для операционной системы Windows 95.

Для разработчиков DirectX представляет собой набор программных интерфейсов, использование которых позволяет решить две основные задачи. Во-первых, DirectX превращает разработанные с его помощью приложения в совместимые с любой версией Windows и работающие на любом компьютере, где установлена эта операционная система, независимо от типа используемого аппаратного обеспечения. При этом подобные приложения максимально используют возможности компьютера, обеспечивая наилучшую производительность. Это достигается за счет сервисов, предоставляемых низкоуровневыми интерфейсами DirectX Foundation.

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

На рис. 1 показана архитектура Microsoft DirectX.

В этом обзоре мы рассмотрим основные компоненты Microsoft DirectX и познакомимся с предоставляемыми ими сервисами.

DirectX Foundation

DirectX Foundation предоставляет в распоряжение разработчиков единый набор программных интерфейсов, который обеспечивает доступ ко всем возможностям, реализованным на уровне аппаратного обеспечения, — 3D-ускорителям, звуковым картам и т.п. Эти программные интерфейсы, называемые низкоуровневыми функциями, включают ускорение отображения двухмерной графики, поддержку устройств ввода информации — джойстиков, мышей и клавиатур, управление микшированием аудиоинформации и ее вывод. Эти низкоуровневые функции поддерживаются компонентами, составляющими DirectX Foundation: Microsoft DirectDraw, Microsoft Direct3D, Microsoft DirectInput, Microsoft DirectSound, Microsoft DirectPlay и Microsoft DirectMusic. Эти компоненты показаны на рис. 2.

До появления DirectX разработчики, создававшие мультимедийные приложения для платформы Windows, должны были настраивать свои продукты на работу с различными типами устройств и конфигураций. Теперь эта проблема решена. DirectX Foundation содержит компонент, известный как «слой аппаратной абстракции» (Hardware Abstraction Layer, HAL), который использует программные драйверы для реализации взаимодействия программного и аппаратного обеспечения. В результате разработчики могут создавать единую версию приложения, использующего интерфейсы DirectX, не заботясь о том, чтобы оно работало на конкретных аппаратных конфигурациях. DirectX автоматически определяет аппаратные возможности компьютера и устанавливает соответствующие параметры. DirectX также позволяет выполнять мультимедийные приложения, требующие аппаратной поддержки, отсутствующей на данном компьютере. В этом случае они программно эмулируются компонентом, который называется «слой аппаратной эмуляции» (Hardware Emulation Layer, HEL) и обеспечивает программные драйверы, работающие как недостающие устройства.

DirectX Media

Как мы выяснили выше, DirectX Foundation выполняет обработку низкоуровневых запросов. Компонент DirectX Media располагается над DirectX Foundation и обеспечивает высокоуровневые сервисы — поддержку анимации, потоковый вывод (возможность передачи и просмотра аудио- и видеоинформации по мере ее загрузки из Internet) и интерактивность. Автоматическая интеграция низкоуровневых сервисов, реализуемых DirectX Foundation, и высокоуровневых, реализованных в DirectX Media, облегчает процесс создания и воспроизведения мультимедийных элементов, позволяя разработчикам включать их в свои приложения и Web-страницы, обеспечивая тем самым недоступное ранее интерактивное мультимедийное содержимое.

Как и DirectX Foundation, DirectX Media состоит из нескольких интегрированных компонентов. К ним относятся: Microsoft DirectShow, DirectAnimation и DirectX Transform. Поддержка DirectShow и DirectAnimation встроена в последние версии браузера Microsoft Internet Explorer. В результате разработчики и Web-дизайнеры получают в свое распоряжение недоступные ранее средства для управления графикой, анимацией, аудио, видео и другими видами онлайновой мультимедиа-информации. Компоненты DirectX Media показаны на рис. 3.

DirectX Media помогает разработчикам решить одну из самых сложных задач, с которой сталкиваются практически все, кто когда-либо пытался создавать игровые программы для платформы Windows, — необходимость координации различных типов мультимедийных эффектов. Эта задача решается двумя способами. Во-первых, DirectX Media предоставляет разработчикам набор программных интерфейсов, которые облегчают создание и взаимную работу различных мультимедийных эффектов. Напомним, что до появления DirectX разработчики использовали различные интерфейсы для управления аудио, видео, анимации и практически не имели возможности их объединения.

DirectX Media также облегчает синхронизацию воспроизведения различных мультимедийных элементов. DirectX поддерживает основанные на временных задержках и маркерах средства координации мультимедийной информации, позволяя разработчикам присоединять мультимедийные элементы к приложениям (двух- и трехмерную анимацию, видео, аудио и т.п.) в одной временной плоскости. Это означает, что разработчик может взять двухмерный персонаж, наложить его на видеоклип, добавить звук и быть уверенным, что все эти три мультимедийных элемента будут выполняться в заданном отношении друг к другу.

Компоненты DirectX

Помимо кратко рассмотренных выше двух основных составляющих Microsoft DirectX в ее состав также входят высокоуровневые компоненты, которые обеспечивают мультимедийные функции для Web-приложений. К этим компонентам относятся: NetMeeting — для организации групповых онлайновых дискуссий и Windows Media Player — средство для передачи мультимедийного содержимого по Internet.

Рассмотрев организацию DirectX, давайте более подробно остановимся на основных возможностях, предоставляемых отдельными компонентами DirectX Foundation и DirectX Media.

DirectX Foundation

Компонент DirectX Foundation является «душой и сердцем» Microsoft DirectX. Как мы уже отмечали, он представляет собой набор низкоуровневых программных интерфейсов, которые обеспечивают воспроизведение различных типов информации и управление устройствами компьютера, работающего под управлением операционной системы Microsoft Windows. DirectX Foundation обеспечивает невозможный ранее доступ к устройствам компьютера и служит основой для реальной аппаратной независимости разрабатываемых мультимедийных приложений.

DirectX Foundation основывается на таких проверенных временем технологиях, как Microsoft DirectDraw, Microsoft Direct3D (режимы Immediate и Retained), Microsoft DirectInput, Microsoft DirectMusic, Microsoft DirectSound, Microsoft DirectPlay и Microsoft DirectSound 3D. Эти программные интерфейсы системного уровня обеспечивают эффективный доступ к различным компьютерным устройствам — 3D-ускорителям, звуковым картам, устройствам ввода информации. DirectX Foundation обеспечивает реальную аппаратную независимость приложений, снимает проблемы установки драйверов и несовместимости аппаратно-программных платформ.

Ниже рассматриваются отдельные компоненты, входящие в состав DirectX Foundation.

Direct3D

Microsoft Direct3D представляет собой интерфейс для работы с 3D-картами. Он поддерживает два режима работы — Immediate Mode и Retained Mode.

Immediate Mode

В режиме Immediate Mode Direct3D обеспечивает разработчикам аппаратную поддержку игровых и мультимедийных приложений в среде Microsoft Windows. Он позволяет добиться аппаратной независимости, поддерживает переключаемую Z-буферизацию и Intel MMX-архитектуру процессоров. В режиме Direct3D Immediate Mode основные графические примитивы реализуются напрямую, без использования буферов выполнения (execute buffers).

Retained Mode

Режим Retained Mode Direct3D облегчает создание и анимацию трехмерных миров, поддерживая две новые функции: интерполяторы анимации со смешением цветов, плавными перемещениями объектов и множеством различных видов трансформации, а также последовательное заполнение сеточной структуры 3D-объектов (meshes), позволяющее осуществлять их постепенную загрузку с удаленных серверов.

Предоставляемые Direct3D Retained Mode возможности позволяют разработчикам приложений эффективно использовать трехмерную графику, освобождая их от необходимости прямого управления структурами объектов на низком уровне.

На рис. 4 показана архитектура Direct3D.

Отметим, что Direct3D-приложения общаются с графическими устройствами одинаково, вне зависимости от режима — Retained или Immediate. Они могут использовать или не использовать программную эмуляцию перед обращением к HAL. Реально Direct3D является интерфейсом к объекту DirectDraw, поэтому на приведенной выше диаграмме слой аппаратной абстракции (HAL) обозначен как DirectDraw/Direct3D HAL.

Direct3D тесно интегрирован с рассматриваемым ниже компонентом DirectDraw. По существу Direct3D осуществляет Z-буферизацию и рендеринг поверхностей, а их непосредственное отображение выполняет DirectDraw. Как мы отмечали выше, COM-интерфейс Direct3D является интерфейсом к объекту DirectDraw.

DirectDraw

DirectDraw — это менеджер управления памятью для графических и видеоповерхностей (surfaces), обеспечивающий базовый набор функций для мультимедийных приложений, работающих на платформе Microsoft Windows. В отличие от традиционной Windows-графики DirectDraw использует прямой доступ к дисплейной памяти и графическим устройствам, обеспечивая при этом полную совместимость с Windows-приложениями.

На рис. 5 показано взаимоотношение между DirectDraw, компонентом ядра операционной системы GDI (Graphics Device Interface), слоем аппаратной абстракции (Hardware Abstraction Layer, HAL) и слоем аппаратной эмуляции (Hardware Emulation Layer, HEL).

Как видно из рис. 5, DirectDraw существует независимо от GDI и оба интерфейса обладают возможностью прямого доступа к графическим устройствам через аппаратно-независимые слои. В отличие от GDI, DirectDraw по возможности использует аппаратные функции. Если конкретное устройство не поддерживает требуемых функций, DirectDraw пытается эмулировать их, используя HEL.

Отметим, что DirectDraw может предоставлять доступ к поверхностям как к контекстам устройств (Device Context, DC), что позволяет использовать функции GDI для работы с поверхностями.

DirectDraw поддерживает работу с большим числом дисплейных адаптеров — от простых мониторов до сложных профессиональных устройств. Работая на уровне графических поверхностей, DirectDraw служит базой для высокоуровневых графических функций и интерфейсов. DirectDraw позволяет либо использовать аппаратные возможности, предоставляемые устройствами, либо эмулировать их при необходимости.

DirectInput


Microsoft DirectInput представляет собой интерфейс к различным устройствам ввода информации — клавиатуре, джойстику, мыши, а также к устройствам с обратной отдачей (force-feedback). Использование DirectInput дает два преимущества по сравнению с обычными, стандартными функциями: данный интерфейс поддерживает большее число устройств и обеспечивает более быструю реакцию на запросы. Работая непосредственно с драйверами устройств, DirectInput не использует систему обмена сообщениями Microsoft Windows.

К новым возможностям DirectInput относится расширенный список поддерживаемых устройств, в числе которых: игровые панели (game pads), авиационные рули (flight yokes), шлемы виртуальной реальности (virtual-reality headgear) и устройства с обратной отдачей, обеспечивающие такие эффекты, как вибрация, сопротивление при движении и т.п., использование которых делает современные игры еще более реалистичными и привлекательными.

DirectMusic

Microsoft DirectMusic — это новый компонент семейства технологий DirectX, который представляет собой принципиально новый подход к оцифрованной музыке на платформе Microsoft Windows. DirectMusic — это программная оболочка для создания музыкальных шаблонов и инструкций по реакции на действия пользователя. Такой подход позволяет разработчикам создавать фоновую музыку, составляемую в реальном времени на основе алгоритмов, задаваемых в Web-страницах или мультимедийных приложениях. Это означает, что времена, когда вы слушали MIDI-файлы, выполняемые в цикле, отошли в прошлое.

DirectMusic основывается на полной реализации стандарта DownLoadable Sounds (DLS) — новой спецификации, позволяющей разработчикам создавать музыкальные шаблоны с уверенностью, что они будут воспроизведены практически на любом устройстве и аппаратной платформе. Так как музыка создается из базовых блоков, предоставляемых разработчиком, то для нее практически не требуется места для хранения и DirectMusic представляет собой идеальное решение для доставки музыкальных фрагментов по Internet. В состав DirectMusic входит DirectMusic Producer — интегрированный редактор, позволяющий работать со всеми объектами DirectMusic: стилями, шаблонами, DLS-инструментами и т.п.

DirectPlay

Microsoft DirectPlay представляет собой высокоуровневый программный интерфейс между прикладной программой и коммуникационными сервисами, который упрощает игры через Internet, связь по модему или локальную сеть. В состав DirectPlay входит набор утилит, позволяющих играющим, в частности, находить партнеров и Web-узлы, поддерживать поток информации между серверами и игроками.

Одним из преимуществ использования DirectPlay является то, что для любого типа игрового приложения поддерживается одинаковый набор функций, независимо от типа онлайнового сервиса или протокола.

На рис. 6 показана архитектура DirectPlay.

DirectSound

Microsoft DirectSound — это аудиокомпонент DirectX, который использует такие возможности, как воспроизведение с микшированием, аппаратные функции и трехмерное позиционирование источников звука. При использовании DirectSound различные аудиосигналы могут одновременно микшироваться и воспроизводиться, необходимые аппаратные функции могут программно эмулироваться, а нестандартные средства микширования обеспечиваются прямым доступом к аудиоустройствам. Интерфейс DirectSound позволяет программно изменять уровень громкости, частоту, позиционирование источников, баланс, а также имитировать трехмерные эффекты, такие как смещение и эффект Доплера.

Начиная с версии DirectX 5 интерфейс DirectSound поддерживает возможность программного управления записью аудиоинформации и различные дополнения, основанные на уникальной функциональности, предлагаемой некоторыми моделями звуковых карт.

На рис. 7 показано взаимоотношение DirectSound с другими компонентами системы.

DirectSound3D

DirectSound3D — это расширение рассмотренного выше интерфейса DirectSound, позволяющее вместо стандартного стереозвука (левый/правый канал и управление балансом) управлять позиционированием источников звука в любую точку трехмерного пространства. Эти возможности могут базироваться как на функциях, реализованных тем или иным аудиоустройством, так и на чисто программных функциях, реализованных на уровне HEL.

DirectX Media

Объединение мультимедийных приложений и сервисов Internet открывает перед разработчиками принципиально новые возможности и более широкие аудитории для создания приложений, использующих различные типы информации. Набор программных интерфейсов Microsoft DirectX версии 6 предоставляет в распоряжение разработчиков унифицированный, полный набор программных сервисов различного уровня — от системного до прикладного. В этом обзоре мы рассмотрим прикладные сервисы, предоставляемые DirectX Media.

Как известно, интерфейс Microsoft DirectX представляет собой набор программных интерфейсов для решения различных задач — от программного управления аппаратным обеспечением до создания виртуальных миров. В дополнение к низкоуровневым интерфейсам, обеспечивающим доступ к аппаратуре и известным как DirectX Foundation, в состав DirectX входит более высокоуровневый набор интерфейсов DirectX Media — набор сервисов, обеспечивающих поддержку потокового вывода информации (streaming), анимации и управления поведением объектов.

DirectX Media — это семейство программных интерфейсов и компонентов для мультимедийных приложений. В настоящее время DirectX Media состоит из следующих программных интерфейсов:

Интерфейс Описание
Direct3D Retained Mode 3D-графика
DirectShow (ранее назывался ActiveMovie SDK) Воспроизведение, потоковый вывод
DirectAnimation (ранее назывался ActiveX Animation) Анимация и интеграция с Dynamic HTML
DirectX Transform Двух- и трехмерные миры, временные задержки для приложений и Web-страниц

Назначение DirectX Media

Набор интерфейсов DirectX Media был разработан для того, чтобы:

обеспечить сервисы прикладного уровня для работы с различными типами информации. DirectX Media обеспечивает сервисы прикладного уровня — аппаратно-независимые сервисы, которые используют системные сервисы DirectX Foundation;

унифицировать сервисы для работы с информацией. Используя DirectX Media, разработчики мультимедийных приложений получают аппаратно-независимый доступ к различным типам информации без потери производительности, так как сервисы DirectX Foundation по-прежнему напрямую работают с аппаратурой. DirectX Media предоставляет в распоряжение разработчиков набор программных интерфейсов, аппаратную независимость на основе архитектуры HAL/HEL (уровень аппаратной абстракции/уровень аппаратной эмуляции) и высокоуровневые интерфейсы к сервисам DirectX Foundation;

предоставить поддержку пользователей и сред. Благодаря аппаратной независимости, использованию компонентной объектной модели (Component Object Model, COM) и интеграции с Internet, сервисы DirectX Media могут быть использованы любыми разработчиками мультимедийных приложений — от Web-дизайнеров до профессиональных программистов.

Архитектура DirectX Media

DirectX Media — это результат разделения интерфейсов DirectX 6 на два уровня — системный уровень, предоставленный DirectX Foundation, и прикладной уровень — DirectX Media. Сервисы DirectX Media используют сервисы DirectX Foundation. К этим сервисам относятся: Direct3D Retained Mode, DirectAnimation, DirectShow и DirectX Transform. DirectX Media также обеспечивает поддержку VRML.

Напомним, что DirectX Foundation обеспечивает следующие сервисы системного уровня: DirectDraw, DirectInput, DirectSound, DirectSound3D и Direct3D Immediate Mode.

После того как мы получили общее представление о DirectX Media, давайте рассмотрим каждый компонент этого интерфейса.

DirectAnimation

Данный компонент, входящий в семейство программных интерфейсов Microsoft DirectX, предоставляет в распоряжение разработчиков набор функций для реализации анимации, потокового вывода информации и интеграции различных типов мультимедийных данных — двухмерной векторной графики, трехмерной графики, спрайтов, аудио- и видеофрагментов. Так как интерфейс DirectAnimation реализован как набор COM-интерфейсов, его функции доступны из различных программных средств и языков программирования:

HTML-разработчики могут использовать DirectAnimation для анимации элементов Web-страниц.

Можно объединять технологию Dynamic HTML со скриптовыми программами (JavaScript/VBScript), управляющими объектами DirectAnimation для создания различных мультимедийных эффектов в HTML-документах.

Любые средства разработки и языки программирования, поддерживающие COM-технологии: Java, Visual Basic, Microsoft Visual C++, Borland Delphi, могут использоваться для создания интерактивных мультимедийных приложений.

На рис. 8 показана архитектура DirectAnimation.

Мультимедийные компоненты DirectAnimation

Входящие в состав DirectAnimation мультимедийные компоненты (ранее называвшиеся Multimedia DHTML-компонентами) обеспечивают доступ к функциональности DirectAnimation из скриптовых программ, располагаемых в HTML-документах. Эти мультимедийные компоненты позволяют создавать изображения на основе векторной графики, управлять графическими изображениями, использовать анимацию и могут быть включены в состав HTML-документов. К мультимедийным компонентам DirectAnimation относятся:

компонент Path для перемещения других объектов по заданной геометрической или сплайновой траектории с возможностью управления скоростью перемещения, проигрыванием вперед и назад и т.п.;

компонент Sequencer для создания комплексных последовательностей с использованием компонентов ActiveX, скриптовых программ и Dynamic HTML;

компонент Sprite для добавления к HTML-документам статических и анимированных графических изображений и управления ими;

компонент Structured Graphics для создания векторной графики и манипуляций с ней.


Более подробно об этих компонентах см. статью «Microsoft DirectAnimation. Клиентские компоненты» в этом номере КомпьютерПресс.

DirectShow

Microsoft DirectShow (предыдущее название — Microsoft ActiveMovie) представляет собой архитектуру для реализации потокового воспроизведения на платформе Microsoft Windows с поддержкой мультимедийных потоков. Такие потоки могут содержать аудио- и видеоданные, представленные в различных форматах, включая MPEG, Apple QuickTime, AVI и WAV. Также реализована возможность сохранения информации на основе Video for Windows (VFW) или Windows Driver Model (WDM).

Компонент DirectShow интегрирован в Microsoft DirectX, что позволяет ему использовать различные сервисы — работу с аппаратными функциями аудио- и видеоустройств, тем самым обеспечивая оптимальную производительность. Для разработчиков Internet- и Intranet-приложений в состав DirectShow входит компонент Windows Media Player, позволяющий воспроизводить мультимедийные данные в различных форматах, а также обеспечивающий такие сервисы, как воспроизведение MPEG-фильмов и видео в формате DVD. Начиная с версии DirectX Media 6.0 компонент Windows Media Player заменяет ранее использовавшийся компонент ActiveMovie.

DirectX Transform

DirectX Transform служит для реализации различных типов трансформаций и переходных эффектов, которые могут быть применены к графическим изображениям и трехмерным объектам. Благодаря своей гибкой архитектуре, DirectX Transform может настраиваться на различные типы данных и, таким образом, является программно расширяемым. Данный компонент используется совместно с DirectAnimation при создании Web-приложений, мультимедийных приложений и других типов программ.

Будущее DirectX

Фирма Microsoft уже объявила о некоторых возможностях, которые появятся в будущих версиях DirectX. В частности, в версии 7.0 (которая должна выйти в конце 1999 года) планируется ввести новые функции для трехмерного звука, многоканального аудио, AC-3 (Dolby Digital) и графики, улучшения производительности, поддержку новых типов устройств, аппаратную реализацию трансформаций и источников света, механизмы расширений, геометрический морфинг и интеграцию с технологией Fahrenheit.

DirectX for Visual Basic

В состав DirectX 7.0 будет входить DirectX for Visual Basic — языковая поддержка для разработчиков на Visual Basic, которая позволит им создавать игровые и мультимедийные приложения на языке Basic так же легко, как это сейчас делают разработчики на C/C++ и Java. Ядром DirectX for Visual Basic станет динамически загружаемая библиотека (DLL), которая будет осуществлять перенаправление объектов между ядром DirectX и Visual Basic. Данная библиотека будет поддерживать основные типы данных, свойственные Visual Basic, и изолировать разработчиков на этом языке от необходимости использовать несвойственную им семантику. Для обеспечения наибольшей гибкости и совместимости объектная модель останется той же, что доступна сейчас из языков C/C++.

Помимо этого в состав DirectX for Visual Basic будет включено множество примеров, компонентов и справочная система.

DirectX 8.0 и далее. . .

В версии 8.0 впервые появятся первые плоды совместной деятельности двух компаний — Silicon Graphics и Microsoft.

Microsoft также работает над технологией, имеющей кодовое название Talisman, — проектом, который содержит спецификации по разработке устройств, совместимых с DirectX и обеспечивающих дополнительную функциональность для двух- и трехмерной графики, видео- и аудиовоспроизведения. Данная спецификация рассчитана на разработчиков материнских плат и графических ускорителей.

Fahrenheit

Говоря о будущем технологии DirectX, следует упомянуть и совместный проект фирм Silicon Graphics и Microsoft под названием Fahrenheit. Целью данного проекта является разработка архитектуры для графических технологий, которые могли бы использоваться в различных областях. В этом проекте также участвуют такие фирмы, как Intel и Hewlett-Packard.

В состав Fahrenheit входит три основных компонента:

Низкоуровневый программный интерфейс (Fahrenheit Low Level API, FLL), рассчитанный на пользовательские и профессиональные графические приложения, работающие в среде Windows. Аналогами FLL являются Direct3D Immediate Mode и OpenGL. Данный интерфейс полностью совместим с уже существующими приложениями и драйверами, написанными для Microsoft Direct 3D и OpenGL. После выхода FLL заменит Direct3D и обеспечит интеграцию с OpenGL.

Интерфейс Scene Graph (Fahrenheit Scene Graph, FSG), который позволит увеличить производительность графических приложений и расширить их функциональные возможности. Данный интерфейс базируется на сервисах, предоставляемых OpenGL, Direct3D Immediate Mode и FLL, и предоставляет древовидные структуры, в которых отдельные сцены могут быть описаны в терминах геометрии, текстур, освещения и т.п. Таким образом, приложения указывают, что необходимо отобразить, а не какими средствами это достигается. FSG является дальнейшим развитием таких технологий, как Performer, Open Inventor, Cosmo3D и OpenGL++.

Модель Large Model Visualization (FLM), с помощью которой станет возможным управление большими трехмерными моделями. Данная модель основана на SGI OpenGL Optimizer и HP DirectModel. FLM будет представлять собой расширение FSG, обладающее функциональностью, необходимой для визуализации моделей большого размера, например целого автомобиля, и будет поддерживать конструктивы, используемые в САПР, такие как NURBS, волнистые поверхности (curved surfaces) и т.п.

Архитектура проекта Fahrenheit показана на рис. 9.

Первые компоненты проекта Fahrenheit — Fahrenheit Scene Graph и Fahrenheit Large Model появятся в IV квартале 1999 года, Fahrenheit Low Level API — в следующем году.

Технология DirectX

DirectX — совокупность технологий, разработанных корпорацией Microsoft с целью превратить Windows в оптимальную платформу для мультимедийных приложений и компьютерных игр с полноцветной графикой, видео, трехмерной анимацией и объемным звуком.

До появления DirectX практически все игры для компьютеров PC реализовывались на платформе MS-DOS. Каждую программу разработчикам приходилось комплектовать множеством видео- и аудиодрайверов (с тем, чтобы охватить как можно больше установленных у пользователей аппаратных компонентов) и при этом применять расширители DOS для преодоления барьера в 640 Кбайт. Среда Windows, упростившая взаимодействие пользователей с ПК благодаря удобному графическому интерфейсу, не облегчила жизнь программистов: в Windows графические программы функционировали слишком медленно. Как ни парадоксально это звучит, Windows, являясь графической средой, не была приспособлена для выполнения быстрых графических операций.

Пытаясь поправить ситуацию, Microsoft разработала для создателей компьютерных игр и графических приложений технологию WinG, которая обеспечивала более быстрое выполнение графических операций, чем интерфейс GDI (Graphics Device Interface) Windows. В то же время корпорация не ограничивалась только решением проблем производительности. Разработчики стремились к тому, чтобы программисты могли создавать игровые и прикладные программы, не задумываясь о том, какие аппаратные компоненты имеются у конкретного пользователя. Сама операционная среда должна была содержать все необходимые драйверы и взять на себя взаимодействие программы с аппаратурой ПК, такой как аудио, видеоплаты и принтеры.

Между тем, даже после выхода в свет ОС Windows 95, платформа Microsoft по-прежнему не соответствовала заявленным обещаниям. Только сегодня, с появлением усовершенствованных технологий, получивших обобщенное название DirectX, положение начинает меняться.

Технология DirectX позволяет программистам создавать в Windows приложения со встроенным доступом к аппаратным средствам. При этом им не нужно знать специфику аппаратной конфигурации определенного компьютера — явного программирования конкретной платы не требуется. Фактически DirectX выполняет роль промежуточного звена между программой и драйвером, преобразуя обобщенные команды в команды, специфические для того или иного устройства.

Если первоначально DirectX была ориентирована на превращение Windows 95 в полноценную платформу для компьютерных игр, всегда стимулировавших развитие аппаратных средств ПК, то по мере проникновения в массовые приложения технологий мультимедиа комплект программных интерфейсов DirectX становится важной частью операционной системы.

DirectX включает в себя следующие API:

— DirectD raw — обеспечивает доступ к аппаратным средствам, отвечающим за изображение. Предлагается возможность работать с двумерной графикой и напрямую управлять видеопамятью, оверлеями и сменой видеостраниц.

— DirectSound — как видно из названия, этот компонент обеспечивает аппаратно независимый интерфейс воспроизведения звука. DirectSound позволяет приложениям полностью использовать возможности аппаратных компонентов, обеспечивающих работу со звуком, например, микширование без временных задержек.

— Directlnput — обеспечивает аппаратно независимый ввод данных в систему в режиме реального времени. События, обрабатываемые Directlnput, формируются клавиатурой, мышкой и джойстиком.

— DirectPlay — представляет собой независимый протокол для осуществления связи между компьютерами. Может применяться для многопользовательских игр, связь в которых осуществляется через Интернет, локальную сеть или прямое последовательное соединение с помощью кабеля. Интерфейс, именуемый DirectPlay Lobby, позволяет создавать онлайновые места встреч в Интернете, попадая в которые множество людей могут объединяться и совместно участвовать в играх.

— Direct3D — это подсистема создания трехмерных графических изображений. Состоит из API низкого уровня, который обеспечивает несколько базовых возможностей создания изображения, и API высокого уровня, который осуществляет комплекс операций, образующих изображение.

HAL и HEL

До появления DirectX создателям приложений мультимедиа для платформы Windows приходилось настраивать свои продукты для работы на широком спектре устройств и конфигураций. DirectX предусматривает так называемый уровень абстрагирования аппаратных средств HAL (Hardware Abstraction Layer). HAL функционирует как промежуточное звено между программным обеспечением и аппаратурой, позволяя разработчикам обращаться к тем или иным компонентам, не зная их марки, модели и других деталей. В результате они получают возможность писать лишь одну версию приложения, взаимодействующую с DirectX. Кроме того, DirectX предоставляет в распоряжение разработчиков инструментальные средства для достижения наивысшей производительности. Данный базовый слой определяет возможности аппаратуры компьютера и устанавливает соответствующие параметры приложения. Он обеспечивает также выполнение мультимедиа-приложений, использующих функции, не поддерживаемые в системе на аппаратном уровне. Это достигается за счет уровня HEL (Hardware Emulation Layer), с помощью которого DirectX программно эмулирует функции, не реализуемые самим устройством. Если аппаратное обеспечение не совместимо с запрашиваемым программой сервисом, уровень HEL пытается эмулировать его наилучшим возможным образом. Чаще всего эмулируются средства 3D-графики. Хотя эмуляция и не так эффективна, как аппаратная реализация, зато разработчику не приходится писать несколько версий одной и той же программы.

DirectDraw

Интерфейс DirectDraw предоставляет разработчикам средства более прямого доступа к аппаратным компонентам, чем это возможно в системе Windows 95 с ее виртуальными драйверами устройств, а это в свою очередь приводит к существенному ускорению графических операций. С появлением DirectDraw разработчики стали наконец рассматривать Windows 95 как серьезную платформу для компьютерных игр и других мультимедийных приложений. Многие средства DirectDraw прямо или косвенно применяются в Direct3D.

Именно DirectDraw — единственный компонент DirectX, взаимодействующий с HAL. Использующие DirectDraw приложения взаимодействуют только с DirectDraw и не могут обращаться непосредственно к HAL. Этот интерфейс повышает производительность приложений за счет поддержки функций 2D-графики, быстрого выполнения» операций с растровыми изображениями, пересылки битовых блоков (blitting), прозрачного наложения объектов и управления несколькими слоями анимации.

По существу, DirectDraw представляет собой диспетчер видеопамяти. Он позволяет программисту хранить текстуры и манипулировать ими непосредственно в видеопамяти, используя преимущества пересылки блоков, реализованной на аппаратном уровне. Такая пересылка из одной области видеопамяти в другую осуществляется намного быстрее, чем передача из системной памяти в видеопамять (особенно в случае использования 64-разрядных видеоплат). К тому же данные операции выполняются независимо от ЦП. Тем самым процессор освобождается для иной работы. Кроме того, DirectDraw поддерживает другие механизмы аппаратного ускорения, реализуемые видеоплатой, такие как спрайты и Z-буферизация.

DirectDraw реализует интерфейс с видеопамятью, используя четыре объекта: DirectDraw. DirectDrawSurface. DirectDrawPalette и DirectDrawClipper. Объект DirectDraw, плата адаптера дисплея, является основным. Объект DirectDrawSurface представляет видеопамять, куда помещаются отображаемые данные. Обычно DirectDrawSurface используется следующим образом. В памяти создаются два буфера (для смены изображений). Отображаемые фрагменты записываются в первый буфер (а не выводятся на экране непосредственно), а те, что должны отображаться следующими, во второй. Затем происходит переключение буферов — второй буфер становится текущим, и изображение обновляется. Direct3D позволяет выполнять приложение в режиме полного экрана или в окне, а также оперативно настраивать в программе разрешение дисплея.


Объект DirectDrawPaiette допускает применение для каждого фрагмента собственной палитры из 256 цветов или использование общих палитр, а DirectDrawClipper позволяет приложениям, выполняемым в окне, работать в обход GDI, уменьшая задержки при выводе графики и предоставляя прозрачный доступ к аппаратуре графических ускорителей.

Direct3D

Компонент Direct3D помогает интегрировать с приложениями Windows 3D-графику. Он применяется для разработки интерактивных приложений трехмерной графики и программ реального времени. Несомненными его достоинствами являются независимость от устройств, общая модель драйверов (гарантирующая поддержку минимального набора средств и возможностей), простота включения в приложения функций трехмерной графики. Созданные с помощью Direct3D прикладные системы могут работать на разных аппаратных платформах, поскольку все средства D i rect3D реализуются «поверх» HAL. Кроме того, Direct3D предлагает разработчикам аппаратных средств спецификацию, помогающую создавать платы, изначально поддерживающие различные средства Direct3D. Одним из наиболее важных качеств Direct3D является прозрачный доступ к графическим ускорителям. Если аппаратная платформа не поддерживает какой-то функции, Direct3D реализует ее эквивалент программным путем. В процессе своего исполнения приложение может определять наличие аппаратных компонентов и использовать их возможности. Кроме того, Direct3D реализует быстрый программно выполняемый рендеринг, для чего применяется полный конвейер рендеринга 3D-графики. При наличии соответствующей аппаратной поддержки часть операций такого рода осуществляется аппаратурой компьютера .

Пользователю средства Direct3D доступны через интерфейсы Retained Mode и Immediate Mode. Retained Mode базируется на Immediate Mode и некоторых средствах DirectDraw. Вместе с HAL эти интерфейсы по сути и образуют Direct3D. Direct3D Retained Mode (интерфейс отображения объектов Direct3D после их группирования) позволяет разработчикам комбинировать мультимедиа-информацию (например, графику и звук) для создания трехмерных сцен и управлять этими сценами в своих приложениях. Для корректного воспроизведения система файлов Direct3D хранит информацию, необходимую для трехмерного рендеринга, включая текстуры, порядок расположения объектов, маршрут анимации и другие детали.

Direct3D Immediate Mode (интерфейс непосредственного отображения объектов Direct3D) реализован на уровне DirectX Foundation и предоставляет разработчикам более прямой доступ к аппаратным средствам. Он обеспечивает повышенную скорость и гибкость, но в этом случае рендеринг сцены и управление ею должны осуществляться самим программистом. Кроме того, Direct3D работает совместно с HEL и реализует программную эмуляцию средств рендеринга 3d-графики, не поддерживаемых аппаратурой. Этот слой тесно интегрирован с DirectDraw HAL и драйверами GDI системы Win32, что помогает унифицировать модель драйверов для ускорения обработки трехмерной графики.

Один из наиболее важных элементов Direct3D — механизм рендеринга, отвечающий за определение сцены (как набора точек в трехмерном пространстве), различные спецификации текстур, источников света и камер. Функционально механизм рендеринга реализуется с помощью трех матриц: трансформации, освещенности и растеризации.

Модуль на основе этих матриц строит одну составную, которая и используется в вычислениях (в последних версиях Direct3D для ускорения вычислений применяется технология ММХ).

Модуль просчета освещенности использует для работы данные, полученные от модуля трансформации. Он учитывает положение источников света, уровень рассеянной освещенности и оптические свойства материалов. При этом допускается реализация двух моделей: монохромной и RGB. В монохромной модели для каждого источника света учитывается только монохромная интенсивность, и затем для данного участка вычисляется одно значение полутени. Цветовые компоненты светового потока игнорируются. Модель RGB помогает сделать сцену более реалистичной за счет учета цветовых характеристик источника света и материала освещаемого объекта.

Модуль растеризации отвечает непосредственно за отображение полученных данных. Он просматривает список вершин и генерирует их трансформированные образы для окончательной визуализации с учетом параметров отсечения и наличия скрытых поверхностей.

Таким образом, механизм рендеринга сводится к следующему: точки трехмерной модели преобразуются модулем трансформации в эквивалентные двухмерные данные, которые передаются модулю, вычисляющему интенсивность падающего на них света, а затем направляются модулю растеризации, определяющему прозрачность и налагающему текстуры.

Компоненты Directlnput и DirectSound

Directlnput реализует поддержку в приложениях таких периферийных устройств управления, как джойстики. Он позволяет разработчикам программировать взаимодействие с этими устройствами, используя уровень HAL или HEL. В то же время Directlnput не ограничивается игровыми контроллерами и реализует интерфейс ввода данных с таких устройств, как графические планшеты.

Компонент DirectSound выполняет роль интерфейса с аппаратурой, предназначенной для воспроизведения звука. Он обеспечивает проигрывание файлов *.WAV и позволяет применять буферы разного типа (основные, вспомогательные, статические и потоковые). В основной буфер (используемый в данный момент компьютером) помещаются файлы из вспомогательных буферов (отведенных для каждого файла *.WAV). Небольшие файлы для ускорения доступа можно помещать в статические буферы, а более длинные -циклически загружать в потоковые буферы по частям. Кроме того, DirectSound предоставляет микшер, управляющий различными параметрами воспроизведения (от громкости до эффектов объемного звучания, применяемых к вспомогательным буферам).

Мультимедийный слой DirectX

Над базовым уровнем DirectX (DirectX Foundation) расположен мультимедийный слой DirectX Media. Если DirectX Foundation реализует функции нижнего уровня, то DirectX Media предоставляет средства высокого уровня для поддержки анимации, потоков мультимедиа (просмотр и прослушивание видео- и аудиофайлов, загружаемых из Internet), а также интерактивных функций.

DirectX Media, как и DirectX Foundation, состоит из нескольких интегрированных компонентов: DirectShow. DirectModel. Direct-Animation. DirectPlay. DirectSD Retained Mode (иногда в него включают и поддержку VRML). В частности, DirectShow и DirectPlay встроены в последние версии Microsoft Internet Explorer. С помощью набора взаимосвязанных фильтров (взаимодействующих с потоком данных через диспетчер фильтров) DirectShow выполняет функции воспроизведения потоков аудио и видео в различных форматах (MPEG, QuickTime, AVI и WAV). Этот компонент является одним из примеров реализации встраивания в операционную систему тех средств, которые ранее предлагались в качестве интегрируемых модулей и программных дополнений, поставляемых независимыми разработчиками.

Другие компоненты мультимедийного слоя обеспечивают иные функции высокого уровня, каждая из которых помогает разработчикам полностью использовать возможности аппаратных средств мультимедиа. DirectModel реализует рендеринг и взаимодействие с крупными объектами 30-графики. DirectAnimation позволяет разработчикам комбинировать звук с движением двух- и трехмерных изображений и связывать их с временными и инициируемыми пользователем событиями в целях создания сложных анимаций. Компонент DirectPlay спроектирован в основном для диалоговых игр с участием нескольких партнеров и приложений, в которых используются диалоговые коммуникации между пользователями сети. Он позволяет воспроизводить мультимедиа при работе в сети, осуществляя обмен информацией о ходе игры и сообщениями между ее участниками. Язык моделирования виртуальной реальности VRML

(Virtual Reality Modeling Language) использует DirectX для реализации трехмерных «виртуальных миров» в Web-браузерах, что существенно увеличивает скорость их отображения.

В целом мультимедийный слой DirectX помогает разработчикам решить одну из наиболее сложных задач, возникающих при создании высококачественных игровых программ для Windows и мультимедиа-приложений, — координировать различные типы мультимедийных эффектов. Это делается с помощью набора API-интерфейсов, синхронизирующих разные эффекты в рамках одного приложения. До появления D irectX в подобной ситуации приходилось использовать API-интерфейсы разных производителей (средств видео, аудио или анимации), что затрудняло объединение элементов. Слой DirectX Media помогает разработчикам также синхронизировать воспроизведение мультимедиа, привязывая его элементы к единой шкале времени.

Библиотека компонентов и другие элементы высокого уровня

DirectX Foundation и DirectX Media предоставляют разработчикам еще одно важное средство — библиотеку компонентов, которую можно использовать для создания компьютерных игр и мультимедиа-приложений. Такая библиотека упрощает процесс разработки, поскольку позволяет программистам применять большое число стандартных интерфейсов и элементов. Кроме того, реализуемые DirectX Media операции высокого уровня используются в следующем, компонентном слое, состоящем из приложений, построенных на основе базового и мультимедийного слоев. Такими компонентами являются, в частности, ActiveMovie, NetMeeting и NetShow, входящие в состав IE 4, Windows 98 и Windows NT 5.0. DirectX дает возможность разрабатывать целую систему подобных компонентов, количество которых продолжает увеличиваться. Кроме того, компоненты, составляющие DirectX, предоставляют разработчикам гибкую платформу для использования самых современных технологий.

Что нужно для программирования

В интерфейсе DirectX реализованы принципы модели COM (Component Object Model), что позволяет оформлять необходимые функции в виде компонентов или объектов. Значительное число API-интерфейсов DirectX представляет собой набор OLE-объектов. Все функции, поддерживаемые СОМ-объектом, можно использовать в качестве интерфейса при взаимодействии с этим объектом. Такой интерфейс представляет собой просто группу родственных функций, используемых для доступа к различным методам объекта. Применение СОМ-объектов в DLL-библиотеках дает ряд преимуществ перед экспортом обычных API-интерфейсов. Использовать указанные СОМ-объекты в приложении C++ или Object Pascal не труднее, чем любой другой API-интерфейс. Заголовочный файл DirectDraw описывает классы C++ для различных объектов DirectX. Экземпляры этих классов создаются путем вызова соответствующих функций «create». Естественно, создание Windows-приложений, использующих DirectX, требует навыков работы с инструментарием SDK или MFC.

Читать онлайн «Графика для Windows средствами DirectDraw» автора Трухильо Стэн — RuLit — Страница 8

Далее рассмотрены функции интерфейса DirectDraw. Обратите внимание на то, что в оставшейся части этой главы термин интерфейс DirectDraw относится как к интерфейсу DirectDraw, так и к DirectDraw2. Уточнения будут приведены лишь в тех случаях, когда функция отличается в двух интерфейсах.

Функции создания интерфейсов

Интерфейс DirectDraw представляет саму библиотеку DirectDraw. Этот интерфейс является главным в том отношении, что в нем создаются экземпляры всех остальных интерфейсов DirectDraw. Интерфейс DirectDraw содержит три функции, предназначенные для создания экземпляров интерфейсов:

Функция CreateClipper() создает экземпляры интерфейса DirectDrawClipper. Объекты отсечения (clipper) используются не всеми приложениями DirectDraw, так что в некоторых программах эта функция может отсутствовать. Вскоре мы рассмотрим интерфейс DirectDrawClipper подробнее.

Функция CreatePalette() создает экземпляры интерфейса DirectDrawPalette. Палитры, как и интерфейс DirectDrawClipper, используются не всеми приложениями DirectDraw. Например, приложению, работающему только с 16-битными видеорежимами, палитра не понадобится. Тем не менее приложение, работающее в 8-битном видеорежиме, должно создать хотя бы один экземпляр DirectDrawPalette.

Экземпляры интерфейса DirectDrawSurface создаются функцией CreateSurface(). Поверхности обязательно присутствуют в любом приложении DirectDraw, работающем с графическими данными, поэтому данная функция используется очень часто.

Экземпляры самого интерфейса DirectDraw создаются функцией DirectDraw Create(). DirectDrawCreate() — одна из немногих самостоятельных функций DirectDraw, не принадлежащих никакому COM-интерфейсу.

Интерфейс DirectDraw позволяет точно узнать, какие возможности поддерживаются как на программном, так и на аппаратном уровне. Функция GetCaps() инициализирует два экземпляра структуры DDCAPS. Первая структура показывает, какие возможности поддерживаются непосредственно видеокартой, а вторая — что доступно посредством программной эмуляции. Функция GetCaps() помогает определить, поддерживаются ли нужные возможности.

DirectDraw автоматически использует аппаратную поддержку, если она имеется, и по умолчанию в случае необходимости переключается на программную эмуляцию. Неудачей заканчиваются вызовы лишь тех функций, которые не поддерживаются ни на аппаратном, ни на программном уровне.

В DirectX SDK входит программа DXVIEW, которая сообщает о возможностях всех компонентов DirectX, в том числе и DirectDraw. На большинстве компьютеров информация о DirectDraw отображается в двух категориях: Primary Display Driver и Hardware Emulation Layer. Первая категория сообщает о возможностях аппаратных видеосредств. Во второй перечислены возможности, эмулируемые DirectDraw при отсутствии аппаратной поддержки. На компьютерах с двумя и более видеокартами, поддерживаемыми DirectDraw, DXVIEW выводит сведения о способностях каждой из них.

Функция SetCooperativeLevel() определяет уровень кооперации — степень контроля над видеокартой, необходимую для данного приложения. Например, нормальный (normal) уровень кооперации означает, что приложение не сможет изменить текущий видеорежим или задать содержимое всей системной палитры. Монопольный (exclusive) уровень допускает переключение видеорежимов и предоставляет приложению полный контроль над палитрой. Независимо от выбранного уровня вам необходимо вызвать SetCooperativeLevel().

Функции для работы с видеорежимами

Интерфейс DirectDraw содержит четыре функции для работы с видеорежимами:

С помощью функции EnumDisplayModes() можно получить от DirectDraw список доступных видеорежимов. По умолчанию EnumDisplayModes() перечисляет все видеорежимы, но по описаниям можно исключить из списка режимы, не представляющие для вас интереса. Функция EnumDisplayModes() не обязана присутствовать в программе, однако это желательно, если вы собираетесь организовать переключение видеорежимов. На рынке существует огромное количество видеоустройств, каждое из которых обладает своими возможностями и ограничениями. Не стоит полагаться на автоматическую поддержку любого конкретного видеорежима, за исключением принятого по умолчанию в Windows режима 640×480×8.

Функция SetDisplayMode() активизирует заданный видеорежим. Версия SetDisplay Mode() из интерфейса DirectDraw2 позволяет дополнительно задать частоту смены кадров. Этим она отличается от функции из интерфейса DirectDraw, в которой можно задать только горизонтальное и вертикальное разрешения и глубину пикселей. Функция SetDisplayMode() присутствует в любой программе, осуществляющей переключение видеорежимов.

Графика для Windows средствами DirectDraw

Трухильо Стэн


Что такое DirectDraw?

Ad Content

Весьма интересное определение DirectDraw можно найти у одного из его самых яростных противников — FastGraph. Графический пакет FastGraph появился уже довольно давно. В настоящее время существует версия FastGraph, которая поддерживает DirectDraw, но скрывает DirectDraw API за своим собственным нестандартным API. Тед и Диана Грубер (Ted and Diana Gruber), создатели и поставщики FastGraph, разместили на своем Web-узле файл, в котором доказывается, что FastGraph лучше DirectDraw.

В числе прочих доводов Груберы заявляют, что DirectDraw представляет собой «просто механизм блиттинга». Такая формулировка оказывается довольно точной, но чрезмерно упрощенной. Правильнее было бы сказать, что DirectDraw — аппаратно-независимый механизм блиттинга, наделенный некоторыми возможностями программной эмуляции. Главная задача DirectDraw как раз и заключается в том, чтобы по возможности быстро и надежно копировать графические изображения в память видеоустройств (блиттинг).

DirectDraw можно рассматривать и с другой точки зрения — как менеджер видеопамяти. DirectDraw распределяет блоки памяти и следит за состоянием каждого блока. Программы могут по своему усмотрению создавать, копировать, изменять и уничтожать такие блоки, причем конкретные подробности этих операций остаются скрытыми от программиста. Такое описание тоже оказывается излишне упрощенным. Во-первых, DirectDraw может использовать не только видеопамять, но и обычную память (RAM). Кроме того, при проектировании менеджеров памяти основное внимание обычно уделяется надежности, а не быстродействию. При проектировании же DirectDraw главной целью было именно быстродействие.

С технической точки зрения DirectDraw представляет собой переносимый API в сочетании с набором драйверов устройств. В своей работе DirectDraw полностью обходит традиционный графический механизм Windows (интерфейс графических устройств, GDI). GDI завоевал дурную славу своим низким быстродействием, поэтому независимость от него крайне важна для достижения оптимальной скорости.

Термины и концепции

Приняв к сведению все эти описания DirectDraw, давайте познакомимся с некоторыми терминами и концепциями, составляющими неотъемлемую часть используемого жаргона. Мы начнем с простейших, но основных понятий, которые относятся к графике вообще, а затем перейдем к специфике DirectDraw.

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается отдельная память, не входящая в основную память компьютера. Память, установленную на видеокарте, мы будем называть видеопамятью, а обычную память (RAM) — системной памятью. Объем памяти, необходимой для поддержки определенного видеорежима, определяется разрешением и глубиной пикселей в этом режиме. Например, для видеорежима 640×480×8 (640×480 пикселей, каждый из которых имеет глубину в 8 бит) требуется 307300 байт. Видеорежим 1024×768×16 требует 1572864 байт. Для поддержки видеорежимов используется видеопамять. Следовательно, режимы, поддерживаемые конкретной видеокартой, ограничиваются объемом установленной видеопамяти. Скажем, режим 1024×768×16 не поддерживается видеокартами с 1 Мбайт памяти, потому что для него такой объем памяти недостаточен.

Одна из ключевых возможностей DirectDraw — переключение видеорежимов. Она позволяет приложению DirectDraw обнаружить и активизировать любой режим, поддерживаемый установленной видеокартой. Переключение режимов подробно рассматривается в главе 4.

Основная причина, по которой DirectDraw обеспечивает оптимальное быстродействие, состоит в том, что во всех возможных случаях применяется аппаратное ускорение. Это означает, что видеокарта выполняет некоторые операции с помощью встроенных в нее аппаратных средств. Аппаратное ускорение обладает двумя основными преимуществами. Во-первых, в нем используются средства, спроектированные специально для ускорения графических операций. Тем самым обеспечивается максимальная скорость выполнения всех действий. Во-вторых,

Direct draw термины и концепции дополнительные интерфейсы directdraw

Приняв к сведению все эти описания DirectDraw, давайте познакомимся с некоторыми терминами и концепциями, составляющими неотъемлемую часть используемого жаргона. Мы начнем с простейших, но основных понятий, которые относятся к графике вообще, а затем перейдем к специфике DirectDraw.

Видеорежимы

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается отдельная память, не входящая в основную память компьютера. Память, установленную на видеокарте, мы будем называть видеопамятью, а обычную память (RAM) — системной памятью. Объем памяти, необходимой для поддержки определенного видеорежима, определяется разрешением и глубиной пикселей в этом режиме. Например, для видеорежима 640×480×8 (640×480 пикселей, каждый из которых имеет глубину в 8 бит) требуется 307300 байт. Видеорежим 1024×768×16 требует 1572864 байт. Для поддержки видеорежимов используется видеопамять. Следовательно, режимы, поддерживаемые конкретной видеокартой, ограничиваются объемом установленной видеопамяти. Скажем, режим 1024×768×16 не поддерживается видеокартами с 1 Мбайт памяти, потому что для него такой объем памяти недостаточен.

Одна из ключевых возможностей DirectDraw — переключение видеорежимов. Она позволяет приложению DirectDraw обнаружить и активизировать любой режим, поддерживаемый установленной видеокартой. Переключение режимов подробно рассматривается в главе 4.

Аппаратное ускорение

Основная причина, по которой DirectDraw обеспечивает оптимальное быстродействие, состоит в том, что во всех возможных случаях применяется аппаратное ускорение. Это означает, что видеокарта выполняет некоторые операции с помощью встроенных в нее аппаратных средств. Аппаратное ускорение обладает двумя основными преимуществами. Во-первых, в нем используются средства, спроектированные специально для ускорения графических операций. Тем самым обеспечивается максимальная скорость выполнения всех действий. Во-вторых, аппаратное ускорение освобождает процессор компьютера от необходимости выполнения этих операций, благодаря чему процессор может заняться другими задачами.

Поверхности

Поверхностью (surface) в DirectDraw называется прямоугольная область памяти, обычно содержащая графические данные. Блок памяти, изображающий поверхность, может находиться как в системной, так и в видеопамяти. Хранение поверхностей в видеопамяти обычно повышает скорость работы программы, поскольку большинство видеокарт не может обращаться к системной памяти напрямую.

Поверхности делятся на несколько типов. Простейшими являются внеэкранные (off-screen) поверхности. Внеэкранная поверхность может находиться как в видеопамяти, так и в системной памяти, но не отображается на экране. Такие поверхности обычно используются для хранения спрайтов и фоновых изображений.

Первичная (primary) поверхность, напротив, представляет собой участок видеопамяти, отображаемой на экране. Любая программа DirectDraw, обеспечивающая графический вывод, имеет первичные поверхности. Первичная поверхность должна находиться в видеопамяти.

Первичные поверхности часто бывают составными (complex), или, что то же самое, переключаемыми (flippable). Переключаемая поверхность может участвовать в переключении страниц — операции, при которой содержимое всей поверхности мгновенно отображается на экране с помощью специальных аппаратных средств. Переключение страниц используется во многих графических программах как с поддержкой DirectDraw, так и без, поскольку оно обеспечивает очень гладкую анимацию и устраняет мерцание. Переключаемая первичная поверхность на самом деле состоит из двух поверхностей, одна из которых отображается на экране, а другая — нет. Невидимая поверхность называется вторичным буфером (back buffer). При переключении страниц поверхности меняются местами: та, которая была вторичным буфером, отображается на экране, а та, что ранее отображалась, превращается во вторичный буфер.

Как внеэкранные, так и первичные поверхности делятся на две разновидности: палитровые (palettized) и беспалитровые (non-palettized). Палитровая поверхность вместо конкретных значений цветов содержит индексы в цветовой таблице, которая называется палитрой. В DirectDraw палитровыми являются только 8-битные поверхности. Поверхности с глубиной пикселей, равной 16, 24 и 32 битам, являются беспалитровыми. Вместо индексов в них хранятся фактические значения цветов.

Поскольку в каждом пикселе беспалитровой поверхности находятся реальные цветовые данные, необходимо знать, в каком формате хранятся отдельные пиксели поверхностей. Формат пикселя описывает способ хранения красной, зеленой и синей (RGB) составляющих. Он зависит от глубины пикселей, видеорежима и аппаратной архитектуры. Форматы пикселей подробно рассматриваются в главе 5.

Блиттинг

На жаргоне, принятом в компьютерной графике, «блиттингом» называется операция копирования. Примером типичного блиттинга служит копирование внеэкранной поверхности во вторичный буфер. Если аппаратное ускорение невозможно, DirectDraw эмулирует блиттинг на программном уровне. Такая эмуляция справляется

Direct Draw 1.0

Размер: 159 Кб

Скачать

Автор Randall Glass Software
  • (Сайт)
  • Языки Русский
    Лицензия Freeware (Бесплатная)
  • Основная информация о программе

    DirectDraw – это довольно таки гибкий и мощный API, при помощи которого программист может создать практически любое графическое приложение для операционной системы Windows.

    С другой стороны DirectDraw – это своеобразный менеджер видеопамяти. Приложение распределяет блоки памяти и следит за состоянием каждого блока в отдельности. Программы в свою очередь могут по своему усмотрению создавать, копировать, вносить изменения и удалять такие блоки, но все подробности подобных операций скрыты от программиста.

    В то же время DirectDraw использует не только видеопамять, но и обычную оперативную память (RAM). Кроме этого, при проектировании менеджеров памяти основное внимание уделяется не быстродействию, а надежности. При проектировании DirectDraw главной целью ставилось именно быстродействие.

    С технической точки зрения DirectDraw – это переносимый API в сочетании с набором драйверов устройств. В работе DirectDraw целиком обходит стандартный графический механизм Windows (GDI, интерфейс графических устройств). GDI за счет своего низкого быстродействия завоевал дурную славу, поэтому для достижения оптимальной скорости крайне важна независимость от него.

    Илон Маск рекомендует:  Что такое код ircg_ignore_add
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL