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


Содержание

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

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

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

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

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

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

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

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

DirectDraw API

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



1. command /E:1000

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

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

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

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

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

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

Основы DirectDraw (DDEX1)

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

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

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

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

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

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

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

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

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

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

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

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

DirectDraw это часть DirectX и представляет из себя API. Первоначально с появлением Windows оказалось, что игры писать практически нельзя. То есть они очень медленно работали. При программировании в Windows графики используется GDI. Но как раз этот GGI очень медленный. Проблема не нова. Те кто программировал в DOS знают, что наибольшею скорость можно достичь, напрямую обращаясь к видеопамяти. Посмотрите на схему ниже, все операции производятся в обход GDI. И мы можем работать либо с уровнем HAL либо HEL. Разница в совместимости. HAL обеспечивает запись в память. Данный компонент имитирует большой участок памяти в независимости от реальной организации видео карты. Для вас память сплошная. При попытке обращения этот уровень разбирается, куда и что нужно писать в реальную память адаптера. HEL создан для унификации. Дело в том, что многие адаптеры поддерживаю ряд возможностей, помогая существенно упростить управление ими. Например, пересылку блоков памяти из одного участка в видео памяти в другой на уровне адаптера. Но этого может и не быть. Вот если этого нет HEL эмулирует данную возможность программно и позволяет не думать о том кто это сделает. Если видео карта, то хорошо, нет программным путем.

Для работы с DirectDraw он должен быть у Вас установлен. Есть много версий DirectDraw. Мы пока будем рассматривать DirectX 7, а соответственно и DirectDraw 7.

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

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 api

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

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

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

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

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

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

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

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

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

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

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

Что такое DirectDraw?

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

Вам потребуется компьютер с процессором 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). При переключении страниц поверхности меняются местами: та, которая была вторичным буфером, отображается на экране, а та, что ранее отображалась, превращается во вторичный буфер.

Стэн Трухильо — Графика для 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). При переключении страниц поверхности меняются местами: та, которая была вторичным буфером, отображается на экране, а та, что ранее отображалась, превращается во вторичный буфер.

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

Наконец, понадобится видеокарта, поддерживаемая библиотекой 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.

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

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

DirectX


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

В состав DirectX входят следующие компоненты:

DirectXGraphics — работа с графикой, этот компонент появился в новых версиях DirectX. DirectXGraphics является совокупностью Direct3D (библиотека для работы с 3D графикой) и вспомогательной библиотеки D3DX, которая позволяет существенно упростить написание приложений.

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

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

DirectInput — работа с устройствами ввода, позволяет работать с множеством разнообразных мышек, клавиатур, джойстиков, в том числе и с использованием ForceFeedback (обратная отдача).

DirectDraw — компонент для работы с 2D графикой, отсутствует в новых версиях DirectX так как вся 2D функциональность присутствует в Direct3D.

DirectShow — компонент для работы с потоковым видео, не рекомендуется Microsoft для разработки (видимо они прекращают ее поддержку)

DirectPlay — компонент для работы с сетью, опять же Microsoft не рекомендует использовать его для разработки, отдавая предпочтение Windows Socket’ам

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

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

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

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

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

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

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

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

DirectDraw API

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

1. command /E:1000

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

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

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

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

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

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

Основы DirectDraw (DDEX1)

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

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

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

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

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

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

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

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

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

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

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

Илон Маск рекомендует:  Goto - Ключевое слово Delphi
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL