Direct draw термины и концепции структуры directdraw


Содержание

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

Программные требования

Для работы с книгой необходимо иметь 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 обеспечивает оптимальное быстродействие, состоит в том, что во всех возможных случаях применяется аппаратное ускорение. Это означает, что видеокарта выполняет некоторые операции с помощью встроенных в нее аппаратных средств. Аппаратное ускорение обладает двумя основными преимуществами. Во-первых, в нем используются средства, спроектированные специально для ускорения графических операций. Тем самым обеспечивается максимальная скорость выполнения всех действий. Во-вторых, аппаратное ускорение освобождает процессор компьютера от необходимости выполнения этих операций, благодаря чему процессор может заняться другими задачами.

Direct draw термины и концепции структуры directdraw

Вам также понадобится собственно 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 называется прямоугольная область памяти, обычно содержащая графические данные. Блок памяти, изображающий поверхность, может находиться как в системной, так и в видеопамяти. Хранение поверхностей в видеопамяти обычно повышает скорость работы программы, поскольку большинство видеокарт не может обращаться к системной памяти напрямую.

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

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 эмулирует блиттинг на программном уровне. Такая эмуляция справляется

Илон Маск рекомендует:  Разновидности циклов в visual basic

DirectDraw

Англо-русский толковый словарь терминов и сокращений по ВТ, Интернету и программированию. . 1998-2007 .

Смотреть что такое «DirectDraw» в других словарях:

DirectDraw — is part of Microsoft s DirectX API. DirectDraw is used to render graphics in applications where top performance is important. DirectDraw also allows applications to run fullscreen or embedded in a window such as most other MS Windows applications … Wikipedia


DirectDraw — est une bibliothèque logicielle de la suite DirectX de Microsoft. Elle est utilisée pour le rendu d image où une haute performance est importante. DirectDraw permet aussi aux applications de se lancer en mode plein écran ou fenêtré comme dans la… … Wikipédia en Français

DirectDraw — DirectDraw, DirectX … Universal-Lexikon

DirectDraw — Microsoft DirectX Entwickler: Microsoft Corporation Aktuelle Version: 10.1 (März 2009 Build) … Deutsch Wikipedia

DirectDraw — … Википедия

DirectDraw — ● ►en np. tm. m. ►AFFICH Anciennement appelé DCI technique définie par Intel et Microsoft, permettant aux applications d envoyer directement des ordres à la carte graphique lorsque le processeur est occupé … Dictionnaire d’informatique francophone

DirectDraw Surface — The DirectDraw Surface file format (uses the filename extension DDS), from Microsoft, is a standard for storing data compressed with the lossy S3 Texture Compression (S3TC) algorithm,[1] which can be decompressed in hardware by GPUs and consoles… … Wikipedia

DirectDraw Surface — DDS (DirectDraw Surface) формат хранения данных, разработанный корпорацией Майкрософт для использования в DirectX SDK. Содержание 1 Общая информация 2 История создания … Википедия

Direct3D — is part of Microsoft s DirectX API. Direct3D is only available for Microsoft s various Windows operating systems (Windows 95 and above) and is the base for the graphics API on the Xbox and Xbox 360 console systems. Direct3D is used to render… … Wikipedia

Microsoft Direct3D — Direct3D is part of Microsoft s DirectX application programming interface (API). Direct3D is available for Microsoft Windows operating systems (Windows 95 and above), and for other platforms through the open source software Wine. It is the base… … Wikipedia

DirectShow — Logo of the DirectX Media SDK – the first time DirectShow was distributed under its current name.[citation needed] DirectShow (sometimes abbreviated as DS or DShow), codename Quartz, is a multimedia framework and API produced by Microsoft for… … Wikipedia

Direct draw термины и концепции структуры directdraw

Начнем написание нашей программы, выбрав «Win32 Application» в диалоге создания нового проекта среды Visual C++. В первом окне мастера выберем «Simple Win32 Application» и позволим Visual C++ создать функцию WinMain. Код, сгенерированный мастером, выглядит так:

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

Первое, что делает эта функция, — это регистрирует класс окна в среде Windows. После заполнения структуры WNDCLASS информация о регистрируемом классе передается в функцию RegisterClass. Заметим, что впоследствии нам понадобится хэндл приложения, поэтому сохраним его в глобальной переменной g_hInst. Еще одна переменная будет содержать хэндл основного окна программы (которое мы собственно и создаем). Обе переменные объявлены чуть выше определения функции WinMain:

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

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

Итак, ваше приложение почти готово к запуску, единственное, что еще нужно сделать — реализовать цикл обработки сообщений. Для того, чтобы приложение смогло «отловить» сообщения, нам нужно вызвать функцию, которая будет обрабатывать пришедшие сообщения. Если мы получили одно из таких сообщений, нам нужно обработать его в функции WndProc. Если никаких сообщений не поступало, мы можем использовать «свободное время» для выполнения каких-либо фоновых вычислений или для задач DirectX. Этот процесс называется idle processing — обработка во время простоя. Цикл обработки сообщений нужно вставить прямо за инициализацией наших глобальных переменных.

В цикле проверяется, есть ли еще в очереди сообщения, которые нужно обработать. Это выполняется вызовом функции PeekMessage. Если функция возвращает истину, мы вызываем функции TranslateMessage и DispatchMessage, что вызывает обработку очередного сообщения. Если сообщений в очереди нет, вызывается функция ProcessIdle. Мы напишем эту функцию так, что она будет обновлять картинку на экране. Вот как определяется эта функция:

Итак, основа нашего приложения готова. Если вы откомпилируете и запустите приложение, вы увидите черное окно, которое занимает весь экран.

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

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

Итак, вся графика хранится в памяти в структурах, называемых поверхностями. Фактически, в приложениях DirectDraw, область, которую мы видим на экране, тоже рассматривается как поверхность, называемая видимой поверхностью или фронт-буфером (frontbuffer). Вместе с видимой поверхностью ассоциируется поверхность, называемая невидимой поверхностью или бэк-буфером (backbuffer). Эта поверхность содержит информацию, которая будет показана пользователю в следующем кадре. Предположим, пользователь видит первый объект на экране в позиции (10,10) , а второй объект — в позиции (100,100). В процессе перемещения первый объет должен оказаться в позиции (12,10), второй объект — в позиции (102, 10). Если мы будем формировать картинку прямо на видимой поверхности, возникнут проблемы с синхронизацией (т.е. пользователь увидит, что сначала переместился первый объект, а затем — второй, но реально они должны перемещаться одновременно, т.е. синхронно). Для решения этой проблемы мы создаем каждый следующий кадр на невидимой поверхности. После совершения всех передвижений в бэк-буфере мы перемещаем информацию с невидимой поверхности на видимую. Этот процесс называется флиппингом и он очень напоминает процесс создания мультипликационных фильмов (когда мы используем множество картинок, нарисованных на бумаге).

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

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

Также проекту нужно «подсказать», какие библиотеки нужны для работы DirectDraw. Идем в меню Project, подменю Settings. Выберите закладку «Link» и добавьте следующие библиотеки в поле «Object/Library Modules» (конечно, если их там уже нет)

Теперь нам нужно создать в программе новую функцию. Эта функция будет называться InitDirectDraw и основной ее целью будет выполнение подготовительных операций — создание объекта DirectDraw и создание двух поверхностей (видимой и невидимой).

Вы, наверное, заметили, что в коде используются несколько необъявленных ранее переменных с префиксом «g_» (глобальная переменная). Так как указатели на видимую и невидимую поверхность будут использоваться во всей нашей программе, поместим их в глобальные переменные. Еще одна очень важная переменная — в ней мы будем хранить объект DirectDraw — g_pDD. Этот объект используется при создании всех остальных объектов, используемых в DirectDraw. Итак, в самом начале нашего кода добавим еще несколько строчек:

Вернемся к функции InitDirectDraw. Первое, что в ней делается — создается объект DirectDraw. Для этого используется функция DirectDrawCreate, которая объявлена в файле ddraw.h. Наиболее важны два параметра этой функции — второй и третий. Второй параметр — это ссылка на переменную, в которой мы будем хранить указатель на объект (в нашем случае это переменная g_pDD). В третьем параметре передается идентификатор версии объекта DirectDraw. Это позволяет работать с ранними версиями DirectDraw после инсталляции новых версий SDK. Например, можно работать с объектами DirectX 7, используя DX SDK 8.1.

Как вы, наверное, заметили, результат функции сравнивается с константой DD_OK, которая означает, что функция выполнилась успешно (это справедливо для всех функций DirectDraw). Важно проверять каждое значение, возвращаемое функциями DirectDraw. Если значение не равно DD_OK, функция InitDirectDraw возвращает -1. В этом случае можно предположить, что на компьютере пользователя не установлена нужная версия DirectX и выдать предупреждающее сообщение (позднее будет продемонстрировано, как это сделать).

Второй вызов функции — SetCooperativeLevel. Эта функция используется для того, чтобы «сообщить» DirectX, каким образом мы собираемся работать с экраном — в полноэкранном режиме или оконном и т.п. Все доступные опции этой функции приведены в документации к DirectX. Опять же результат функции проверяется на корректность.

Третья функция — SetDisplayMode. С помощью этой функции можно установить необходимое разрешение экрана нашего приложения. В приведенном фрагменте устанавливается полноэкранный режим 640×480. В качестве третьего параметра в функцию передается глубина цвета. От этого параметра зависит максимальное количество цветов, отображаемое программой.

После процедур инициализации нам нужно создать две поверхности, которые будут использованы для вывода графики на экран. Сначала инициализируется видимая поверхность. Для создания поверхности в DirectDraw нужно правильно инициализировать поля структуры DDSURFACEDESC2. Очень важно сначала очистить память, занимаемую структурой, функцией ZeroMemory или memset (иначе в некоторых случаях могут возникнуть проблемы). Создавая видимую поверхность, параметру dwflags нужно присвоить значение DDSD_BACKBUFFERCOUNT, указывающее, что поверхность видимая и ей соответствует невидимая поверхность. Параметр ddsCaps.dwCaps нужно инициализировать значением DDSCAPS_PRIMARYSURFACE. Т.к. мы будем осуществлять флиппинг поверхностей, нужно указать параметры DDSCAPS_FLIP и DDSCAPS_COMPLEX.

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

После создания видимой поверхности нам нужно получить ссылку на невидимую поверхность, ассоциированную с фронт-буфером. Это можно выполнить, вызвав метод GetAttachedSurface видимой поверхности. В качестве параметра нужно указать структуру DDSCAPS2.

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

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

Здесь вызывается еще одна функция — CleanUp — которую мы еще не описали. Эта функция должна удалять все созданные объекты DirectX. Все объекты удаляются вызовом метода Release. Вот реализация этой функции:

Прежде, чем мы откомпилируем и запустим приложение, вставьте следующий фрагмент в функцию WndProc, в оператор switch обработки сообщений:

Этот фрагмент кода дает возможность выхода из программы по клавише ESCAPE. Теперь откомпилируйте и запустите приложение и убедитесь, что программа переходит в полноэкранный режим 640×480.

Блиттинг графики

Теперь мы займемся рисованием на невидимой поверхности и флиппингом поверхностей, что в конечном итоге создаст на экране анимированную картинку. Для создания анимации мы будем использовать битмап с несколькими изображениями машины. Для создания спрайта в DirectDraw нам нужно сохранить битмап на отдельной поверхности (которую мы будем называть тайлом или закадровой поверхностью), которую мы затем будем копировать на невидимую поверхность. Для удобства манипулирования тайловыми поверхностями мы создадим класс cSurface. Щелкните правой кнопкой мыши в окне ClassView среды Visual C++ и выберите пункт Create New Class (или выберите пункт меню «Insert» -> «New Class. «). Тип класса оставьте неизменным — Generic Class, а в качестве имени укажите cSurface.

Начнем описание методов нашего класса. Основная переменная будет иметь тип LPDIRECTDRAWSURFACE7, она будет служить для хранения объекта DirectDraw Surface (поверхность DirectDraw). Также мы должны хранить длину и ширину поверхности. Еще одно поле класса — m_ColorKey — подробнее о нем мы поговорим позднее. Вот как выглядит описание переменных создаваемого класса:

Первая функция, которая будет создана в классе — функция Create. Эта функция будет создавать объект типа поверхности DirectX. Вот реализация функции Create:

Как вы наверное заметили, процесс создания тайловой поверхности мало чем отличается от процесса создания видимой поверхности. Вся разница заключается в заполнении полей структуры DDSURFACEDESC2. Параметр dwFlags указывает, что мы будем заполнять поля dwCaps, dwWidth и dwHeight и что их нужно учитывать при создании поверхности. Параметр dwCaps, равный DSCAPS_OFFSCREENPLAIN, указывает, что поверхность закадровая, т.е. невидима. Указывая флаг DDSCAPS_VIDEOMEMORY, мы даем понять, что хотим создать поверхность в видеопамяти.

Проверка ошибок заключается в проверке результата на значение DDERR_OUTOFVIDEOMEMORY, если на компьютере пользователя установлена старая видеокарта с небольшим количеством памяти, можно указать DDSCAPS_SYSTEMMEMORY и попробовать создать поверхность в системной памяти. Процесс блиттинга из системной памяти в видеопамять существенно медленнее, чем блиттинг видеопамять — видеопамять, однако если видеопамяти мало, приходится прибегать и к нему.

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

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

Если вы хотя бы немного работали с функциями GDI, этот фрагмент не покажется вам слишком сложным. Во-первых, нужно вызвать метод Restore переменной m_Surface. Это нужно для восстановления памяти, которая может быть освобождена DirectDraw (если возникает такая ситуация, любое обращение к объекту m_Surface возвращает код ошибки DERR_SURFACELOST). После восстановления памяти мы создаем DC и загружаем картинку из ресурсов. Затем битмап копируется на поверхность с помощью функции StretchBlt. Также мы сохраняем информацию о битмапе в структуре m_srcInfo. Эта структура используется в случае, если поверхность «потеряется», так что мы всегда можем восстановить поверхность и изображение, хранящееся на ней.

Предпоследняя функция, которую нам предстоит реализовать, — функция Draw, которая используется для «рисования» части одной поверхности на части второй. Чаще всего вам придется рисовать на невидимой поверхности, однако метод Draw работает с любыми видами поверхностей.

Алгоритм работы этой функции очень прост. Вначале мы создаем переменную типа прямоугольник (rect) и заполняем ее информацией о позиции и размерах исходной картинки, которую мы хотим поместить на поверхность. После этого мы вызываем метод объекта поверхности BltFast и помещаем картинку на поверхность. Посмотрите, как используется информация о цветовом ключе поверхности. Блиттинг поверхностей, не имеющих цветового ключа, выполняется намного быстрей, чем поверхностей, у которых задан цветовой ключ, так что используйте цветовые ключи только когда это действительно необходимо. Как вы заметили, рисование происходит в бесконечном цикле. Это сделано для того, чтобы в случае потери поверхности мы смогли ее восстановить и повторить операцию блиттинга.

И, наконец, функция Destroy создана для освобождения ресурсов DirectDraw, занимаемых приложением. В нашем случае мы вызываем метод Release объекта m_Surface.

В прилагаемом исходном коде вы увидите несколько дополнительных методов класса cSurface, однако для целей данной статьи описанных методов вполне достаточно. Откомпилируйте приложение.

Рисование на невидимой поверности с помощью класса cSurface

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

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

После этого добавьте в приложение ресурс — картинку из файла bmp_bigcar_green.bmp . Создайте идентификатор (ID) ресурса с именем «IDB_GREENCAR«.

Итак, у нас есть экземпляр класса, нужно вызвать методы создания и загрузки картинки. Этот фрагмент кода должен вызываться после вызова функции InitDirectDraw.

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

Сейчас мы создали и инициализировали нужные объекты и реализовали код для освобождения памяти, выделенной для поверхностей, так что можно приступать к «рисованию» в бэк-буфере и отображению картинки на видимой поверхности. Напомню, что все эти действия выполняются в функции ProcessIdle.

Этот фрагмент кода рисует первую картинку машины по центру невидимой поверхности и осуществляет флиппинг невидимой и видимой поверхности каждый раз при вызове функции ProcessIdle. Давайте чуть изменим код и реализуем анимированное движение машины:

Здесь мы создаем 3 статических переменных. Первые используются для изменения позиции копируемой части исходной картинки. Таким образом мы можем создать эффект анимации, последовательно проходя от кадра 1 до 20. Третья переменная, iLastBlit, хранит результат выполнения функции GetTickCount. Этот результат используется для того, чтобы задержать кадр по меньшей мере на 50 миллисекунд на экране, что нужно для плавного перемещения картинки. Можете удалить фрагмент кода и посмотреть, что получится (на хорошем компьютере картинка будет вращаться очень быстро).

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

НАСТРОЙКИ.

СОДЕРЖАНИЕ.

СОДЕРЖАНИЕ

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

Посвящается Стэнли и Велме Коппок (моим дедушке и бабушке по материнской линии), а также Дж. Д. и Марии Трухильо (дедушке и бабушке по отцовской линии). Их общество и поддержка радовали меня в детстве и продолжают радовать сейчас.

Программисты (особенно начинающие) любят задавать вопросы типа: «Скажи, на чем ты пишешь…?» Когда-то этот вопрос выглядел вполне логично.

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

Сегодня стал актуальным другой вопрос: «А чего стоишь ты сам?» Благодаря непрерывной конкуренции современные средства разработчика стали невероятно мощными и качественными, так что среднему программисту вряд ли удастся выжать из них все возможное. Скорее всего, вы спасуете намного раньше, чем ваш инструментарий — если только не узнаете о нем абсолютно все и не доведете свое мастерство программиста до подлинного совершенства.

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

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

Илон Маск рекомендует:  Types в Delphi

Наша главная цель — поднять ваше мастерство настолько, насколько вы сами захотите. Классные инструменты у вас уже есть, осталось лишь стать классным программистом.

Засидевшись допоздна над своей предыдущей книгой, «Cutting-Edge Direct3D Programming», я решил ложиться спать. Оказалось, что та же самая мысль пришла в голову здоровенному пауку-каракурту. Что еще хуже, для этого нами была выбрана одна и та же кровать. Мы мирно улеглись, не подозревая о присутствии друг друга (во всяком случае, я ничего не подозревал).

До того мне приходилось слышать о каракуртах и даже видеть их время от времени. Бесспорно, они пользуются дурной славой. Я полагал, что после укуса каракурта следуют пять или десять минут невыносимой боли, а затем неизбежно наступает смерть. Оказалось, я ошибался в обоих отношениях. Сам по себе укус проходит совершенно безболезненно, но если его не лечить, боль продолжается до 48 часов. Тем не менее укус каракурта (даже без лечения) редко бывает смертельным.

И мне, и пауку пришлось пожалеть о встрече. Пауку — потому что он был жестоко раздавлен своей разгневанной и удивленной жертвой. Мне — потому что у врача я оказался лишь через восемь часов после укуса (а серьезные мышечные спазмы начинаются через 2–4 часа). После нескольких посещений местной амбулатории проблема была решена. Этой ночью я так и не спал, и к тому же в течение восьми часов мучался от жуткой боли. В довершение всего перед вводом противоядия меня накачали валиумом. Разумеется, о работе не могло быть и речи.


При первой возможности я позвонил своему редактору, Скотту Палмеру (Scott Palmer). Заплетающимся языком я рассказал, что немного задержусь с очередной главой, потому что меня укусил каракурт. Скотт проявил полное понимание, и мы перенесли срок сдачи материала.

Через несколько месяцев Скотт прислал мне первую главу своей новой книги. Книга была посвящена написанию технической литературы, а в главе говорилось о том, что ему пришлось узнать, будучи то автором, то редактором. В самом конце был приведен список отговорок, которыми авторы объясняли свои задержки. Представьте, он начинался с укуса каракурта!

Скотт заверил меня, что он никогда не сомневался в моей искренности, а в список включил сразу все оправдания, независимо от того, поверил он или нет. Тем не менее полагаю, его позиция вполне ясна.

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

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

Другими словами, Coriolis отвечает за распространение и продажу книги, однако за содержащийся в ней материал отвечаю я. Следовательно, если у вас возникнут какие-либо вопросы по поводу программ или CD-ROM, не стесняйтесь и пишите мне. Некоторые читатели обращаются в Coriolis, но издательство все равно просто пересылает почту мне. Если вы захотите обратиться ко мне, обязательно укажите, о какой книге идет речь, и постарайтесь сделать свои вопросы и замечания по возможности конкретными. Со мной можно связаться по адресу mailto:stan@rezio.com.

Кроме того, некоторые вопросы встречаются особенно часто. Я собираюсь создать и вести список ЧаВО (часто задаваемых вопросов) на Web-узле этой книги (www.rezio.com/wgp). Здесь вы найдете ответы на некоторые вопросы, а также исправления ошибок, обновления и, возможно — даже новые демонстрационные программы.

Для чего написана эта книга

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

Эта книга начинается с того, на чем другие книги обычно заканчивались. Мы поговорим об основах DirectDraw, но лишь в общих чертах. Читатель — опытный программист, но незнакомый с DirectDraw — сможет с ходу войти в курс дела. Затем мы перейдем к другим темам, столь же интересным, сколь и полезным.

Цель этой книги — научить вас работать с DirectDraw, а не предоставить некоторую «структурную основу» или нестандартный API, который бы выполнял за вас всю работу. Демонстрационные программы написаны на C++ и используют MFC, но совсем не для того, чтобы скрыть все технические подробности. С++ и MFC — превосходные инструменты, потому что с их помощью любое приложение можно написать несколькими разными способами. Примеры для этой книги были написаны так, чтобы при этом получались структурированные и удобные для чтения проекты, которые наглядно показывают, что и почему происходит в программе.

Помимо DirectDraw, во многих примерах используется библиотека DirectInput. Строго говоря, при программировании графики для Windows можно обойтись и без DirectInput, но ей все же стоит воспользоваться. Она работает быстрее традиционных средств ввода Windows и к тому же входит в DirectX, так что для работы с ней не потребуется никаких дополнительных SDK.

Требования к читателю

Эта книга научит вас почти всему, что можно узнать о DirectDraw. Тем не менее она не учит C, C++, MFC или работе с Developer Studio пакетов семейства Visual — предполагается, что вы уже знакомы с этими темами. С другой стороны, от вас не требуется никаких выдающихся познаний. Например, мы будем использовать MFC, но лишь в объеме, необходимом для написания наших приложений. Следовательно, чтобы читать эту книгу, вовсе не обязательно быть экспертом в MFC.

Стэн Трухильо — Графика для Windows средствами DirectDraw

Стэн Трухильо — Графика для Windows средствами DirectDraw краткое содержание

Графика для Windows средствами DirectDraw читать онлайн бесплатно

Вам потребуется компьютер с процессором 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 называется прямоугольная область памяти, обычно содержащая графические данные. Блок памяти, изображающий поверхность, может находиться как в системной, так и в видеопамяти. Хранение поверхностей в видеопамяти обычно повышает скорость работы программы, поскольку большинство видеокарт не может обращаться к системной памяти напрямую.

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

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

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

Direct draw термины и концепции структуры directdraw

тБЪНЕТ УБНПК УФТХЛФХТЩ. рТПЭЕ ЧУЕЗП ЙУРПМШЪПЧБФШ ПРЕТБФПТ sizeof() ДМС ЙОЙГЙБМЙЪБГЙЙ ЬФПЗП РПМС.

пРТЕДЕМСЕФ — ЛБЛЙЕ ЙЪ ДТХЗЙИ РПМЕК УФТХЛФХТЩ ВХДХФ ЧБМЙДОЩ — ФП ЕУФШ ЪОБЮЕОЙС ЛПФПТЩИ ОХЦОП ЙУРПМШЪПЧБФШ РТЙ УПЪДБОЙЙ РПЧЕТИОПУФЙ. чЕДШ РТЙ УПЪДБОЙЙ РТПУФПК РПЧЕТИОПУФЙ ДБМЕЛП ОЕ ЧУЕ ЙЪ ДЕУСФЛБ РПМЕК ОХЦОП ЙОЙГЙБМЙЪЙТПЧБФШ ЪОБЮЕОЙЕН ЮФП ЧЙДОП ЙЪ ОБЫЕЗП РТЙНЕТБ.

уФТХЛФХТБ Ч УФТХЛФХТЕ (DDSCAPS2) РПМС ЛПФПТПК ПРТЕДЕМСАФ УЧПКУФЧБ РПЧЕТИОПУФЙ Й ЕЕ ФЙР.

ьФП ЪОБЮЕОЙЕ ПФОПУЙФУС ФПМШЛП РПЧЕТИОПУФСН ЛПФПТЩЕ УПЪДБАФУС ЛБЛ РЕТЧЙЮОЩЕ(Ч РТЙМПЦЕОЙЙ ПОБ ПДОБ) Й ПРТЕДЕМСЕФ ЛПМЙЮЕУФЧП ЖПОПЧЩИ ЙМЙ ВЬЛ ВХЖЖЕТПЧ.

ъБ УПЪДБОЙЕ ПУОПЧОПК Й ЖПОПЧПК РПЧЕТИОПУФЙ ПФЧЕЮБЕФ УМЕДХАЭЙК ЛПД : пУОПЧОБС РПЧЕТИОПУФШ УПЪДБЕФУС ЧЩЪПЧПН CreateSurface . рПУЛПМШЛХ РТЙ УПЪДБОЙЙ НЩ ХЛБЪЩЧБЕН ФП, ЮФП ОБН ОХЦЕО ВЬЛ ВХЖЖЕТ — ЕЗП ОБН УПЪДБЧБФШ ОЕ ОХЦОП — ПО ЛБЛ ВЩ РТЙУПЕДЙОЕО Л ОБЫЕК РПЧЕТИОПУФЙ — РПЬФПНХ НЩ РПМХЮБЕН ХЛБЪБФЕМШ ЙУРПМШЪХС ЖХОЛГЙА ЙОЕФТЖЕКУБ >DDSCAPS2 . фХ УБНХА ЮФП ЧИПДЙФ Ч УПУФБЧ DDSURFACEDESC2 . чПФ Й ЧУЕ ДМС ОБЮБМБ ! рПУМЕ ЪБЧЕТЫЕОЙС ТБВПФЩ У DirectDraw ОХЦОП «ХВТБФШ ЪБ УПВПК» : пРЙУЩЧБФШ ЛБЦДХА ЖХОЛГЙА ОЕ ВХДХ — ОБЪОБЮЕОЙЕ ЛБЦДПК ЙФБЛ СУОП ЙЪ ОБЪЧБОЙК. рТЕДПУФПТПЦОПУФЙ ФЙРБ ЙОЙГЙБМЙЪБГЙЙ ХЛБЪБФЕМЕК Ч NULL ДБОШ ОЕ ФПМШЛП ИПТПЫЕНХ УФЙМА ОП Й ОЕ МЙЫОЙЕ РТЕДПУФПТПЦОПУФЙ. иПЮХ МЙЫШ ЮФПВЩ ФЩ ПВТБФЙМ ЧОЙНБОЙЕ ОБ ФП, ЮФП РПУЛПМШЛХ «ПЖЖЙГЙБМШОП» УБНЙ НЩ ОЕ УПЪДБЧБМЙ ВЬЛ ВХЖЖЕТ — ЕЗП «ХДБМСФШ» ОЕ ОХЦОП — ЪБ ЬФП ПФЧЕЮБЕФ g_pDDSPrimary->Release();
фЕРЕТШ ПВТБФЙ ЧОЙНБОЙЕ ОБ ЖХОЛГЙА DisplayWelcomeMsg. х DirectDraw ЕУФШ ПДОП РПМЕЪОПЕ Ч РТПУФЩИ ДЕНПОУФТБГЙПООЩИ(ЙНЕООП ДЕНПОУФТБГЙПООЩИ РП НПЕНХ НОЕОЙА ЙВП ФПТНПЪЙФ) ГЕМСИ УЧПКУФЧП — ПОП НПЦЕФ ЙУРПМШЪПЧБФШ ЖХОЛГЙЙ GDI Windows ДМС ТЙУПЧБОЙС ОБ УЧПЙИ РПЧЕТИОПУФСИ — ДМС ЬФПЗП МЙЫШ ОХЦОП РПМХЮЙФШ ЛПОФЕЛУФ ХУФТПКУФЧБ ЛБЛ ЬФП ДЕМБЕФУС Х НЕОС: лУФБФЙ — ЪДЕУШ С РПУФХРЙМ ОЕ УПЧУЕН ИПТПЫП — С ОЕ РТПЧЕТСА ТЕЪХМШФБФБ. фП ЕУФШ С ОЕ ЪОБА — ЧЕТОХМБУШ МЙ ПЫЙВЛБ ЙМЙ ЧУЕ РТПЫМП ОПТНБМШОП. фБЛ РПУФХРБФШ ОЕ ИПТПЫП — DirectDraw (лБЛ ЧРТПЮЕН Й ЧУЕ ПУФБМШОПЕ, ЛБЛ Й ЧУС ОБЫБ ЦЙЪОШ) ОЕ РТПЭБЕФ ПЫЙВПЛ ;). лУФБФЙ Ч ЬФПК ЖХОЛГЙЙ ЧЕУШ ЧЩЧПД ЙДЕФ ОБ ПУОПЧОХА РПЧЕТИОПУФШ, ФБЛ ЮФП Ч ЬФПН РТЙМПЦЕОЙЙ ЖПОПЧЩК ВХЖЖЕТ БВУПМАФОП ОЕ ЙУРПМШЪХЕФУС. рПУМЕ ЙУРПМШЪПЧБОЙС ЛПОФЕЛУФ ХУФТПКУФЧБ ОХЦОП ХДБМЙФШ :

рБТХ УМПЧ ОБ РПУМЕДПЛ:

  • еУМЙ Ч УЙУФЕНЕ РТЙУХФУФЧХЕФ ОЕУЛПМШЛП ЧЙДЕПЛБТФ ЙМЙ ХУЛПТЙФЕМЕК УРПУПВОЩИ ТБВПФБФШ У DirectDraw ЙМЙ ЦЕ ФЩ ЛБЛ ТБЪТБВПФЮЙЛ РТЕДРПМБЗБЕЫШ ЬФП — ДП ЙОЙГЙБМЙЪБГЙЙ РТЙМПЦЕОЙЕ ДПМЦОП ЪБРТПУЙФШ УРЙУПЛ ЬФЙИ ХУФТПКУФЧ ЖХОЛГЙЕК DirectDraw API DirectDrawEnumerate ЙМЙ DirectDrawEnumerateEx .
  • ч УМХЮБЕ ПЛПООПЗП РТЙМПЦЕОЙС ОБН ОЕ ОХЦОП ХУФБОБЧМЙЧБФШ (ДБ НЩ Й ОЕ НПЦЕН) ЧЙДЕПТЕЦЙН. рПУМЕ УПЪДБОЙС ПУОПЧОПК РПЧЕТИОПУФЙ ОХЦОП УПЪДБФШ Й РТЙУПЕДЕОЙФШ Л ОЕК ФБЛ ОБЪЩЧБЕНЩК ПВЯЕЛФ ПФУЕЮЕОЙС (Clipper) ДМС ЛПОФТПМС ЪБ ПВМБУФША ЧЩЧПДБ. (жХОЛГЙЙ CreateClipper , SetClipper ).
  • пЛПООПЕ РТЙМПЦЕОЙЕ Ч DirectDraw ОЕ НПЦЕФ РПМХЮЙФШ НПОПРПМШОПЗП ДПУФХРБ РТЙ ТБВПФЕ У ЧЙДЕПЛБТФПК. пОП ФБЛЦЕ ОЕ НПЦЕФ ЧЩРПМОСФШ РЕТЕЛМАЮЕОЙС УФТБОЙГ (ЙУРПМШЪХКФЕ ДПВБЧПЮОХА РПЧЕТИОПУФШ Й ЛПРЙТХКФЕ ЕЕ УПДЕТЦЙНПЕ) Й ОЕ НПЦЕФ ЙЪНЕОЙФШ ХУФБОПЧЛЙ ЗМХВЙОЩ ЙМЙ (ЮФП ЧРПМОЕ МПЗЙЮОП) ТБЪТЕЫЕОЙС ЬЛТБОБ (ЗМХВЙОХ Й ЧУЕ РТПЮЕЕ НПЦОП ЛПОЕЮОП РПРЩФБФШУС ЙЪНЕОЙФШ ЧЩЪПЧПН ЖХОЛГЙЙ РПДУЙУФЕНЩ СДТБ windows ChangeDisplaySettings — ОП УФПЙФ МЙ ЙЗТБ УЧЕЮШ ? тБЪЧЕ ТБДЙ ФПЗП, ЮФПВЩ «ЭЕМЛБФШ» РЕТЕЧПДС ЬЛТБО Ч ДТХЗЙЕ ТБЪТЕЫЕОЙС ФЩ УФБМ РЙУБФШ ПЛПООПЕ РТЙМПЦЕОЙЕ ?). рТЙ ТЙУПЧБОЙЙ Ч ПЛПООПН РТЙМПЦЕОЙЙ ДПУФХРЕО чеуш ЬЛТБО — ФП ЕУФШ ЙНЕООП ФЕВЕ ЛБЛ РТПЗТБННЙУФХ РТЙДЕФУС ЛПОФТПМЙТПЧБФШ Й УМЕДЙФШ ЪБ РЕТЕНЕЭЕОЙСНЙ ПЛОБ Й РЙУБФШ ЙНЕООП ФХДБ ЗДЕ ОБИПДЙФШУС ЛМЙЕОФУЛБС ПВМБУФШ ПЛОБ (ЕУМЙ ФЩ ЛПОЕЮОП ОЕ РПЛМПООЙЛ БОПНБМЙК).
  • рБМЙФТПЧЩЕ ТЕЦЙНЩ РПЪЧПМСАФ ЙУРПМШЪПЧБФШ ФТАЛЙ У РБМЙФТПК, ВПМЕЕ ЬЛПОПНЙЮОЩ (Ч ДЧБ ТБЪБ РП УТБЧОЕОЙА У 16 ВЙФОЩНЙ Ч ДЧБ,Б У 32 ВЙФОЩНЙ Ч ЮЕФЩТЕ !), ОП ВПМЕЕ ПЗБОЙЮЕОЩ Й ФТЕВХАФ ЧПЪОЙ У РБМЙФТПК. ч ПЛПООЩИ РБМЙФТПЧЩИ РТЙМПЦЕОЙСИ ДПУФХРОЩ ОЕ ЧУЕ 256 ЬМЕНЕОФПЧ РБМЙФТЩ — ЧПУШНБС ЮБУФШ СЧМСЕФУС УЙУФЕНОПК РБМЙФТПК Windows — ЕЕ ЙЪНЕОСФШ ОЕ ТЕЛПНЕОДХЕФУС.
  • хУФБОПЧЙЧ 16 ВЙФОЩК ЙМЙ 32 ВЙФОЩЕ ГЧЕФБ ЧЩСУОЙ РПТСДПЛ Й ВЙФОПУФШ УМЕДПЧБОЙС ЛПНРПОЕОФ. л РТЙНЕТХ 16 ВЙФОЩК RGB ТЕЦЙН НПЦЕФ ВЩФШ ЛБЛ 5-5-5 ВЙФ (1 ВЙФ РХУФ) РПД ЛБЦДХА ЛПНРПОЕОФХ ГЧЕФБ, ФБЛ Й 5-6-5. б ФП Й ЧППВЭЕ BGR. йУРПМШЪХКФЕ ДМС ЬФПЗП GetPixelFormat НЕФПД IDirectDrawSurfase7 ЙОФЕТЖЕКУБ.

ьФБ УФБФШС СЧМСЕФУС ЙОФЕММЕЛФХБМШОПК УПВУФЧЕООПУФША БЧФПТБ(JM). рЕТЕРЕЮБФЛБ ЙМЙ РХВМЙЛБГЙС ПФДЕМШОЩИ ЕЕ ЮБУФЕК ЙМЙ ГЕМЙЛПН ТБЪТЕЫЕОБ У ПВСЪБФЕМШОЩН ХЛБЪБОЙЕН ЙУФПЮОЙЛБ.

Введение в 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 разработан таким образом, чтобы автоматически поддерживать будущие новации в программном и аппаратном обеспечении, и, следовательно, разработчики и пользователи могут быть уверены в том, что и в дальнейшем будут использовать максимальные возможности своих компьютеров.

Илон Маск рекомендует:  Что такое fluke

На рис. 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 — в следующем году.

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