Direct draw термины и концепции введение


Direct draw термины и концепции введение

Начнем написание нашей программы, выбрав «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 миллисекунд на экране, что нужно для плавного перемещения картинки. Можете удалить фрагмент кода и посмотреть, что получится (на хорошем компьютере картинка будет вращаться очень быстро).

Direct draw термины и концепции введение

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

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

С уважением,
команда разработчиков eManual.ru

Краткое описание по работе с DirectDraw.

Краткое описание по работе с DirectDraw Краткое описание по работе с DirectDraw Содержание Краткий обзор DirectDraw DirectX API Что такое DirectDraw Взаимотношение с WinG Поверхности DirectDraw — вид доступа к видеопамяти От смены страниц (flipping) к анимации Интерфейсы DirectDraw и COM Программирование DirectDraw Что Вам необходимо для использования DirectDraw Инициализация DirectDraw Создание первичной поверхности и установки для обеспечения смены страниц (flipping) Загрузка изображений в видеопамять (bitmap) Загрузка палитры Настройка прозрачного цвета Собрать все вместе и готово. Построение динамики. Очистка по окончании использования DirectDraw и MFC Особености встраивания объектов DirectDraw в МFС Поддержка оконного интерфейса при использовании DirectDraw в МFС Прямое рисование (минуя GDI) Некоторые детали Вопросы отладки Выполнение в окне Потеря поверхности Что еще почитать Краткое описание по работе с DirectDraw В этом разделе будет дан общий обзор DirectDraw, а также общие концепции.

Microsoft’s DirectX API состоит из следующих групп: DirectDraw — прямой доступ к видеопамяти DirectSound — прямой доступ к звуковой карте DirectPlay — прямой доступ к сетевым возможностям для обеспечения multiplayer mode DirectInput — поддержка игровых устройств ввода Все это предназначено для того, чтобы дать возможность программисту получить прямой доступ к различному (в основном игровому) железу. В данной статье дается пояснения к использованию интерфейса DirectDraw.

2. Что такое DirectDraw

DirectDraw это обычный менеджер видеопамяти. Его основное назначение предоставить программисту прямой доступ к видеопамяти. Осуществлять такие операции, как копирование видео память -> видеопамять и т.п.. При этом напрямую могут использоваться возможности видеоконтроллера и освобождать от этих операций центральный процессор. Кроме того, DirectDraw напрямую использует и другие возможности Вашей виде окарты, как то спрайты, z — буферизацию и т.п.. Начиная с 5 версии DirectX дополнительно используются (во всяком случае декларируется использование) возможностей ММX — что позволяет за один цикл обрабатывать и передавать 64 бита видеоинформации.

3. Взаимоотношение с WinG

В основном идея DirectDraw взята с WinG. Отличие состоит в том, что в основу идеологии WinG положено копирование изображений из обычной памяти в видеопамять, в то время как основной идеей DirectDraw является копирование видеопамяти в видеопамять, хотя также может поддерживаться и режим память->видеопамять. Что, конечно, является необходимым в мире видео карт с 1 метром видеопамяти.

4. Поверхности DirectDraw — вид доступа к видеопамяти

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

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

5. От смены страниц (flipping) к анимации

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

Частота смены буферов может быть достаточно высокой и ограничена частотой кадровой развертки монитора (60 — 100 Гц). Поддержка DirectDraw вертикальной развертки приводит к более гладкой смене кадров.

Интерфейсы DirectDraw и COM

Все DirectX объекты являются порождениями от COM объектов.

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

Программирование DirectDraw Здесь будут представлены примеры использования DirectDraw в основном основанные на примерах к DirectX SDK. Данные примеры, конечно, будут полностью функциональными , но не совсем годными для практических приложений. Это вызвано тем, что в практических реализациях необходим учет характера поведения конкретного приложения, а здесь приводятся лишь грубые схемы. p>

1. Что Вам необходимо для начала использования DirectDraw

Для начала необходимо заиметь DirectX SDK. Где его взять? Путей много, например: DirectX SDK ver.3 входит в состав Visual C++ (ver.5), DirectX SDK версии 5.0 я нашел на http://www.download.com, DirectX SDK ver.5.2. предлагает бесплатно за 12$ Microsoft на своем сайте (Вам вышлют CD по почте — но это для владельцев American Express или VisaCard), компакт-диски MSDN также могут содержать данный SDK. И конечно на рынках пиратских CD

В состав SDK входят все необходимые библиотеки, заголовочные файлы, help файлы и большой набор примеров

Типовым джентльменским набором является ddraw.h , ddraw.dll , ddraw.lib (implib на ddraw.dll)

В общем, необходимо включить в Ваш проект DDraw.lib и в исходный файл ddraw.h

Использовать DirectDraw можно только с Win32 (Windows 95, NT (не пробовал)). Если Вы используете версию Win95 OSR, то там скорее всего DirectX уже установлен. Кроме того DirectX скорее всего установила Вам какая нибудь игрушка (см. DDraw.dll в поддиректории system )

Программировать с использованием DirectDraw можно в различных средах программирования. Все примеры, приводимые ниже, точно должны работать с Microsoft Visual C++ ver.5

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

Первым делом, при использовании DirectDraw ,необходимо его инициализировать. Ниже дан пример кода инициализации

Пример инициализации DirectDraw LPDIRECTDRAW lpDD; // указатель на объект DirectDraw // вообще их может быть несколько, я ,например, использовал //по одному объекту на каждое окно в MDI приложении (см пример //использования DirectDraw c MFC) /* * Функция инициализации объекта DirectDraw * 1) Создаем Direct Draw Object * 2) Устанавливаем вид доступа * 3) Устанавливаем видео моду дисплея * */ BOOL DirectDrawInit(HWND hwnd) < HRESULT ddrval; /* * Создание (получение) указателя на основной объект DirectDraw. * */ ddrval = DirectDrawCreate( NULL, &lpDD, NULL ); if( ddrval != DD_OK ) < goto lError; >/* * Теперь зададим уровень доступа, который может иметь следующие значения * * DDSCL_EXCLUSIVE дает Вам полный доступ к видеопамяти и управлению видеорежимами * требует флаг DDSCL_FULLSCREEN , т.е. Вы работаете со всем экраном сразу * Это основной (типовой режим работы DirectDraw * DDSCL_NORMAL используется для обеспечения оконного доступа. Правда доступ * у вас все равно ко всему экрану , обеспечивать оконность все равно приходится вручную * (обычные недоделки Microsoft) * как добиться оконного поведения см пример класса CDDrawView доступном для download на данном * сайте */ ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ); if( ddrval != DD_OK ) < lpDD->Release(); goto lError; > /* * Установим видео моду 800×600 256 цветов * (видео моду можно изменять, только если установлен флаг DDSCL_EXCLUSIVE */ ddrval = lpDD->SetDisplayMode( 800, 600, 8); if( ddrval != DD_OK ) < lpDD->Release(); goto lError; > return TRUE; lError: // здесь можно вставить код для оповещения пользователя о невозможности // инициализации DirectDraw return FALSE; >
Таким образом мы проинициализировали DirectDraw и изменили видео моду (в отладчике Developer Studio режим 640х480 устанавливать не рекомендую, эффект потрясающий — практически становятся видны только меню и туулбары)

3. Создание первичной и вторичной поверхностей и установки для обеспечения смены страниц (flipping)

В следующем участке кода мы рассмотрим создание первичной и вторичной поверхностей (видеобуферов) . Их объединение часто называют комплексной поверхностью

Пример инициализации поверхностей (первичной и вторичной) DirectDraw LPDIRECTDRAWSURFACE lpDDSPrimary; // указатель на первичную поверхность DirectDraw LPDIRECTDRAWSURFACE lpDDSBack; // указатель на вторичную поверхность DirectDraw BOOL CreatePrimarySurface() < DDSURFACEDESC ddsd; DDSCAPS ddscaps; HRESULT ddrval; // создадим первичную поверхность с одной вторичной memset( &ddsd, 0, sizeof(ddsd) ); ddsd.dwSize = sizeof( ddsd ); ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; // поле ddsCaps принимается в рассмотрение и в // нем имеет значение только количество вторичных //буферов(поверхностей) ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; ddsd.dwBackBufferCount = 1; ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL ); if( ddrval != DD_OK ) < lpDD->Release(); return FALSE; > // Теперь получим вторичный буфер (поверхность) ddscaps.dwCaps = DDSCAPS_BACKBUFFER; ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack); if( ddrval != DD_OK ) < lpDDSPrimary->Release(); lpDD->Release(); return FALSE; > return TRUE; >
4. Загрузка изображений в видеопамять (bitmap)

Следующим шагом является загрузка изображений в видеопамять. Идеальным является случай, когда в видеопамяти достаточно места для того чтобы там ужились все необходимые Вам для разработки изображения. Если ее не хватает , тоже особенно беспокоится не о чем, CreateSurface создаст поверхности в обычной памяти (правда, это чуть замедлит).

Пример кода загрузки изображений в DirectDraw /* * Функция DDLoadBitmap( >CreateSurface(&ddsd, &pdds, NULL) != DD_OK) < return NULL; >else < return pdds; >> /* * Функция копирования ранее загруженного изображения в видео поверхность * (Используется обычный GDI интерфейс) * Это, конечно, не самый быстрый способ — но зато надежный * A в данный момент спешить некуда. Если у Вас происходит динамическая подгрузка * изображений в процессе то лучше эту функцию переписать аккуратнее */ HRESULT DDCopyBitmap( >GetDC(&hdc)) == DD_OK) < BitBlt(hdc, 0, 0, dx, dy, hdcImage, 0, 0, SRCCOPY); pdds->ReleaseDC(hdc); > SelectObject(hdcImage, hbmOld); DeleteDC(hdcImage); return hr; >
Таким образом, мы имеем возможность загрузить все необходимые изображени я в видео поверхности DirectDraw. Для создания динамического изображения остается только организовать их копирование в на поверхности видеоизображения (первичный или вторичный буфер).

5. Загрузка палитры

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

Пример кода создания палитры в DirectDraw /* * Создание палитры DirectDraw для файла загружаемого с диска * параметр szBitmap имя файла */ > 8) n = 0; else if (bi.biClrUsed == 0) n = 1 Пример кода загрузки палитры в DirectDraw . lpDDPal = LoadPaletteFromDibFile(lpDD, szBitmap); // Создадим и Получим указатель на палитру if (lpDDPal) lpDDSPrimary->SetPalette(lpDDPal); // и установим эту палитру для первичной видео поверхности .
5. Настройка прозрачного цвета

В DirectDraw возможно использование прозрачного цвета(ов) (входа в палитру (color key)) используемого при копировании с поверхности на поверхность. Обычно для этого задается диапазон цветов (входов в палитру), которые не переносятся при копировании (Blt функциях).

Пример кода установки прозрачных цветов в DirectDraw // Установим прозрачный цвет для данного изображения . // DDCOLORKEY ddColorKey; ddColorKey.dwColorSpaceLowValue = 0xff; // весь диапазон прозрачности — 255 вход в палитру (обычно он черный) ddColorKey.dwColorSpaceHighValue = 0xff; // Далее необходимо сделать что-то типа для вех поверхностей (изображений ) для которых нужен эффект // прозрачности при выполнении операций копирования [Имя указателя на DirectDraw поверхность]->SetColorKey( DDCKEY_SRCBLT, &ddck );
7. Собрать все вместе и готово. Построение динамики.

Теперь осталось только организовать цикл по обновлению вторичной поверхности и после его обновления проведения смены экранов (Flip) . Этот цикл лучше всего организовывать на цикле обработки сообщений Вашего приложения (OnIdle), таким образом Вы получите максимальную производительность для конкретной машины на которой выполняется ваше приложение. Сажать это на таймер я не советую — Вам просто будет сложно разобраться и все так подогнать, чтобы с одной стороны по максимуму использовать возможности машины, а с другой не перегружать очередь сообщений. Для общей синхронизации разумно использовать функции мультимедиа типа функции timeGetTime() которая выдает время в мс. Также учтите что чем больше нитей (THREAD) Вы организуете для обеспечения расчетов расположения изображений тем сложнее Вам будет добиться плавности (Windows 95 совсем не многозадачка с вытеснением и квантом времени я не нашел как управлять). Единственное ,что можно использовать для увеличения плавности — Sleep(0) для текущей нити приложения. Но это о другом — просто лирическое отступление — плач по отсутствию возможностей.

Обновления экрана vo >BltFast( 0, 0, lpDDBackgraund, &mRect, DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT); if( ddrval != DD_OK ) < // не смогли - вернемся return; >while ([цикл по всем изображениям, которые должны быть перенесены на экран]) < // Получить текущее изображение (указатель lpDDCurrentImage) из списка, массива - чего было задумано, // а также его размера mW >BltFast( x, y, lpDDCurrentImage, &mRect, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT ); if( ddrval != DD_OK ) < //не смогли - вернемся return; >> // Теперь все нарисовано — можно поменять экран ddrval = lpDDSPrimary->Flip( NULL, DDFLIP_WAIT ); >
К данному коду надо сделать ряд замечаний : BltFast — функция, конечно, хорошая и по названию зазывающая, но не всегда идет — тогда используй обычный Blt (он видимо помедленнее — но надежней) DDXX_WAIT флаг необходим для медленных видео карт и шустрых машин — просто без его использования функция возвращает управление сразу после запуска , а при его использовании только после окончания процесса копирования. — просто пока идет одно копирование вызов другого вроде может привести к ошибке. Память то захвачена другим процессом. 8. Очистка по окончании использования

По окончании работы не забудьте вызвать Release() для всех порожденных Вами объектов DirectDraw. Что то типа приведенного ниже кода.

Очистка после себя vo >Release(); lpDDSPrimary = NULL; > if( lpDDSOne != NULL ) < lpDDSOne->Release(); lpDDSOne = NULL; > if( lpDDPal != NULL ) < lpDDPal->Release(); lpDDPal = NULL; > lpDD->Release(); lpDD = NULL; >
DirectDraw и MFC 1.Особености встраивания объектов DirectDraw в МFС

Библиотеку классов MFC можно считать основной для разработки интерфейсных приложений для платформы Win32. К сожалению, фирма Microsoft как разработчик и MFC и DirectX не дает прямых указаний по использованию DirectX в приложениях написанных на основе библиотеки MFC. Есть правда несколько статей в Microsoft Developer Network Library. Это видимо связано с тем, что использование быстрого интерфейса DirectX в достаточно медленном MFC — нецелесообразно. Однако это становится совсем не очевидным на машинах класса Pentium 200.


Для библиотеки MFC типовой является работа с окнами с развитым пользовательским интерфейсом — а не голая поверхность экрана — поэтому для MFC разумным является не полноэкранное использование DirectDraw , а оконное. Хотя путем извращений можно из MFC сделать и полноэкранного ублюдка. Но встает вопрос — а зачем тогда MFC. Т.е. все, что ранее писалось про Flip — здесь не применимо. Типовое использование — создание буфера видеоизображения Вашего окна, рисование на нем с последующим копированием в зону Вашего окна на экране.

2. Поддержка оконного интерфейса при использовании DirectDraw в МFС

При использовании DirectDraw в приложениях на базе MFC возможно два основных подхода; создание прослоенного класса на базе класса CView (или аналогичного) и замена в своем порождении от класса CView на свой, переделанный класс. встраивание в свой класс CView (иного CMainFrame) переменных DirectDraw Мне больше импонирует первый способ т.к. позволяет решить проблему использования DirectDraw одноразово и в дальнейшем скрыть вообще использование DirectDraw. (А зачем вообще тогда нужно C++?).

Пример такого построения использован в классе CDDrawView , который можно загрузить отсюда .

Отмечу основные методы данного класса: инициализация объектов DirectDraw производится в методе OnInitialUpdate() переписан метод OnPaint() в котором создается указатель на CDC за экранной поверхности , вызывается метод OnDraw(CDC* pDC ), по окончании которого производится копирование содержимого за экранной поверхности в область текущего окна переписан метод OnSize — при изменении размеров окна производится уничтожение старой за экранной поверхности и инициализация новой. переписан метод OnEraseBackgraund() Я думаю, для выяснения деталей лучше просто посмотреть исходники.

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

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

Что такое DirectDraw?

Ad Content

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

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

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

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

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

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

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

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

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

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

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

Введение в Microsoft DirectX

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

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

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

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

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

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

DirectX Foundation

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

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

DirectX Media

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

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

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

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

Компоненты DirectX

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

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

DirectX Foundation

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

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

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

Direct3D

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


Immediate Mode

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

Retained Mode

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

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

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

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

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

DirectDraw

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

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

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

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

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

DirectInput

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

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

DirectMusic

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

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

DirectPlay

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

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

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

DirectSound

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

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

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

DirectSound3D

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

DirectX Media

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

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

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

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

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

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

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

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

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

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

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

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

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

DirectAnimation


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

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

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

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

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

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

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

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

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

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

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

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

DirectShow

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

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

DirectX Transform

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

Будущее DirectX

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

DirectX for Visual Basic

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

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

DirectX 8.0 и далее. . .

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

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

Fahrenheit

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

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

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

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

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

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

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

Общие понятия реляционного подхода к организации БД. Основные концепции и термины

В данном разделе рассматриваются на сравнительно неформальном уровне:

· основные понятия реляционных баз данных;

· существо реляционной модели данных.

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

4.1. Основные понятия реляционных баз данных

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

Для начала покажем смысл этих понятий на примере отношения СОТРУДНИКИ, содержащего информацию о сотрудниках некоторой организации.

Понятие тип данных в реляционной модели данных полностью адекватно понятию типа данных в языках программирования. Обычно в современных реляционных БД допускается хранение

· символьных, числовых данных, битовых строк,

· специализированных числовых данных (таких как «деньги»),


· специальных данных (дата, время, временной интервал)

· развивается подход к расширению возможностей реляционных систем абстрактными типами данных.

В нашем примере мы имеем дело с данными трех типов: строки символов, целые числа и «деньги».

Понятие домена более специфично для баз данных, хотя и имеет некоторые аналогии с подтипами в некоторых языках программирования. В самом общем виде домен определяется заданием:

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

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

Наиболее правильной интуитивной трактовкой понятия домена является понимание домена как допустимого потенциального множества значений данного типа. Например, домен «Имена» в нашем примере определен на базовом типе строк символов, но в число его значений могут входить только те строки, которые могут изображать имя (в частности, такие строки не могут начинаться с мягкого знака).

Следует отметить также семантическую нагрузку понятия домена: данные считаются сравнимыми только в том случае, когда они относятся к одному домену. В нашем примере значения доменов «Номера пропусков» и «Номера групп» относятся к типу целых чисел, но не являются сравнимыми.

4.1.3. Атрибут, схема отношения, схема БД

Прежде чем переходить к другим понятиям – введем понятие «Схема отношения» и «Схема БД»

Атрибут – определение домена для выбранного отношения.

Схема отношения — это именованное множество пар <имя атрибута, имя домена (или типа данных)>. Степень или «арность» схемы отношения — мощность этого множества. Степень отношения СОТРУДНИКИ равна четырем, то есть оно является 4-арным.

Если все атрибуты одного отношения определены на разных доменах, осмысленно использовать для именования атрибутов имена соответствующих доменов (не забывая, конечно, о том, что это является всего лишь удобным способом именования и не устраняет различия между понятиями домена и атрибута).

Схема БД (в структурном смысле) — это набор именованных схем отношений.

4.1.4. Кортеж, отношение

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

Отношение — это множество кортежей, соответствующих одной схеме отношения.

Обычным житейским представлением:

· таблица — схема отношения;

· заголовок таблицы – отношение;

· строки таблицы — кортежи;

· столбцы таблицы — имена атрибутов;

· набор таблиц – схема БД.

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

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Сдача сессии и защита диплома — страшная бессонница, которая потом кажется страшным сном. 8773 — | 7144 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Direct draw термины и концепции введение

Основные сведения о новом интерфейсе программирования игровых программ для Windows 95. DirectDraw — графический компонент недавно появившегося пакета разработки игровых программ Game SDK фирмы Microsoft — новый мощный инструмент, который наконец-то дает разработчикам возможность низкоуровневого доступа к миллионам плат видеоакселераторов, применяемых в современных ПК. В первой из двух статей мы обсудим, что же, в сущности, представляет собой интерфейс DirectDraw и как его можно использовать. В следующей статье мы представим вам игру, написанную нами с использованием DirectDraw, а также поговорим о многократно используемых классах Си++, применяемых в нашей игре.

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

В настоящее время DirectDraw имеет три основных достоинства. Первое из них — аппаратная пересылка растрового (двоичного) блока (hardware blitting), представляющая собой способность использовать соответствующее устройство (blitter) на видеоплате для копирования изображений из одной области видеопамяти в другую. В дополнение к стандартным пересылкам растровых блоков (bit blok transfer), DirectDraw позволяет выполнять прозрачную пересылку (transparent blits), когда все пикселы указанного цвета игнорируются и, в силу этого, не отображаются в приемнике. Поскольку аппаратные пересылки растровых блоков выполняются асинхронно, ЦП в это время может заниматься другой работой.

Второе достоинство — листание страниц (page flipping) — метод, для реализации которого создаются два или большее число «экранов»: первая страница и одна или несколько страниц заднего плана. Первая страница выводится на экран в текущий момент времени, а страница заднего плана скрыта из виду. Рендеринг выполняется на фоновой странице; страницы переключаются после того, как построено окончательное изображение: фоновая страница с только что сформированным изображением, теперь видимая, становится передней. И наоборот, бывшая передняя страница перемещается на задний план и можно приступать к построению на ней нового экрана.

Последнее достоинство интерфейса DirectDraw — цветовая заливка (color filling). Операция цветовой заливки напоминает аппаратную пересылку растровых блоков, но в данном случае аппаратные средства заполняют указанную область видеопамяти одним цветом. Этот прием может быть полезен для удаления спрайтов и целых страниц.

Модель компонентного объекта

Прежде чем пользоваться интерфейсом DirectDraw, вам будет полезно познакомиться с основами Модели компонентного объекта (COM — Component Object Model), так как все компоненты пакета Game SDK инкапсулированы в объектах COM. Объект COM очень похож на объект Си++, с некоторыми важными отличиями. Вы можете создать экземпляр объекта COM, вызвать методы его интерфейсов (эквивалент принадлежащих функций) и уничтожить его после того, как прекратите им пользоваться. Вы не можете напрямую обращаться к параметрам объектов COM, и они не имеют конструкторов и деструкторов. Обычно вместо конструктора предусматривают функцию создания, а для удаления объекта COM применяют метод Release базового интерфейса IUnknown.

Завладев указателем на объект COM, вы можете вызывать его принадлежащие функции точно так же, как и в случае с объектом Си++, так как формат COM распознается большинством Windows-компиляторов Си++. В действительности, поскольку интерфейс COM фактически скрыт функциями DirectDraw API, мы свободно можем обращаться к объектам DirectDraw так, как если бы они были обычными объектами Си++.

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

Файлы заголовков пакета Game SDK содержат несколько макрокоманд, которые делают доступ из Си не столь неуклюжим.

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

Первый параметр — указатель на глобально уникальный идентификатор (GUID), представляющий собой драйвер, для которого должен быть создан объект DirectDraw. Используйте параметр NULL, если хотите работать с активным дисплеем, если же вы хотите принудительно использовать режим программной эмуляции, то остановите свой выбор на DDCREATE_EMULATIONONLY. (У вас может появиться желание использовать эмуляцию только для тестирования и отладки или для того, чтобы удостовериться, что ваша прикладная программа способна работать в режиме эмуляции. DirectDraw имеет «слой» аппаратной эмуляции, имитирующей средства, которые могут отсутствовать в самом видеодрайвере DirectDraw, а также возможности, отсутствующие на видеоплате, например способность растягивать изображение.) Если функция DirectDrawCreate завершается успешно, то pDirectDraw будет инициализирован действительным указателем на объект DirectDraw, а hResult примет значение DD_OK. Если она заканчивается неудачно, то hResult будет иметь некоторое значение, отличное от DD_OK. Последний параметр предназначен для агрегирования объектов OLE2 и может быть оставлен пустым (NULL).

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

После того как вы изменили уровень кооперации, вам нужно установить режим дисплея. Интерфейс DirectDraw позволяет работать с многими значениями разрешения и глубины цвета, но в настоящий момент в сочетании с аппаратным ускорением реализованы только это 640×480 или 640×400 при глубине цвета 8 или 16 бит на пиксел. Последняя редакция DirectDraw предусматривает также параметры разрешения ModeX 320×200 и 320×240 при глубине цвета 8 бит/пиксел, но эти режимы предполагают простой доступ к буферу кадра, подобный реализованному в DOS. Использование режима ModeX возможно только в случае, если при вызове функции SetCooperativeLevel установлен флаг DDSCL_ALLOWMODEX.

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

Следующий шаг — создание первичного объекта DirectDrawSurface, который представляет или «поверхность» дисплея, или неотображаемый буфер и располагается в системной или видеопамяти. Его принадлежащие функции позволяют копировать данные с одной поверхности на другую, листать страницы и выполнять многие другие операции. Поверхности DirectDraw создаются с помощью принадлежащей функции CreateSurface объекта DirectDraw:


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

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

Следующий шаг — создание объекта DirectDrawPalette с помощью функции CreatePalette. Объекты DirectDrawPalette представляют собой 16- или 256-индексные палитры, которые могут присоединяться к поверхностям. Как правило, выбирают 256-цветную палитру. Для ее создания нужно организовать массив структур PALETTEENTRY. Это те самые структуры RGB, которые вы используете для создания обычных палитр GDI. Заполнив массив 256-цветными триадами, вы передаете их в функцию CreatePalette:

Теперь все 8-разрядные значения на первичной поверхности будут проиндексированы относительно указателя pDDPalette для получения верных значений RGB.

Практическое применение Directdraw

После того как мы определили все существенные моменты применения DirectDraw, обсудим некоторые функции и приемы программирования, которые могут понадобиться при написании общеупотребительных сценариев.

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

Для простых прозрачных и копирующих пересылок блоков функция BltFast предпочтительнее, чем Blt. Если вы используете программную эмуляцию, то быстродействие BltFast на 10% выше, чем Blt; однако если вы полагаетесь на аппаратные пересылки, то разницы в быстродействии нет. При желании выполнить сплошную цветовую закраску или прибегнуть к более изощренным эффектам, основанным на блоковой пересылке данных, следует использовать стандартную функцию Blt.

Данная строка копирует область, определенную параметром sourceRect из pSourceSurface в позицию с координатами nDestX, nDestY на поверхности pDestSurface, используя цветовой ключ поверхности источника для прозрачности. Цветовой ключ для любой поверхности можно определить с помощью функции SetColorKey:

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

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

При программировании игр часто возникает необходимость простой пересылки изображения с одной поверхности на другую, бывает нужно также манипулировать конкретными битами, составляющими образ в видеопамяти. Чтобы сделать это, вам необходимо получить указатель на область памяти поверхности с помощью функции Lock поверхности, которую вы должны вызвать с указанием структуры RECT, определяющей прямоугольную область, подлежащую блокированию. Если вам нужна вся поверхность, то указатель прямоугольника должен быть пустым (NULL). Когда функция Lock завершит свою работу, структура DDSURFACEDESC будет содержать указатель на память поверхности в элементе lpSurface. Не забудьте поставить его в соответствие типу указателя, так как он относится к LPVOID и не имеет размера. Также обратите внимание на флаг DDLOCK_WAIT: в момент вызова функции Lock DirectDraw может все еще быть занят пересылкой растровых блоков, и эта операция вследствие возникшего конфликта закончится неудачей. Если установлен флаг ожидания, то DirectDraw дождется окончания пересылки.

После вызова функции Lock указатель pBits будет указывать на область памяти, занимаемую целевой поверхностью, независимо от того, находится ли она в системной или видеопамяти. Когда вы завершите запись на эту поверхность, не забудьте вызвать функцию Unlock. В промежутке между вызовами функций Lock и Unlock следует быть осмотрительным, поскольку в это время нельзя использовать стандартные отладчики ГИП.

В дополнение к блокированию поверхности на время выполнения специальных операций пересылки растровых блоков вы можете также получить стандартный контекст устройств (device context, DC) Windows, относящийся к данной поверхности. Наиболее ценное достоинство такого подхода — возможность передать обработку всех текстов функции TextOut интерфейса графических устройств GDI. Почти все современные видеоплаты располагают теми или иными аппаратными средствами быстрого формирования шрифтов TrueType, поэтому данный способ, вероятно, обладает более высоким быстродействием, чем стандартный метод хранения растровой карты для каждой цифры и буквы.

Чтобы получить контекст устройства для какой-либо поверхности, следует вызвать принадлежащую функцию GetDC. Передаваемый ею в вызывающую программу дескриптор (handle) контекста устройства представляет собой стандартный Windows hDC и может использоваться соответствующим образом. После того как вы покончили с hDC, вам следует вызвать функцию ReleaseDC. Всякий раз при вызове функции GetDC интерфейс DirectDraw выполняет внутренний вызов функции Lock, поэтому ограничения, налагаемые на процесс отладки в промежутке между вызовами функций Lock и Unlock, действуют и для функций GetDC и ReleaseDC.

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

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

Пол Модзелевски — консультант, специализирующийся на разработке интерактивных мультимедиа-программ на Си++ для Windows 95. К нему можно обратиться по адресу pmodz@mlj.com. Джиорджи Грелл — программист, работающий на Си++ в компании MLJ и специализирующийся на графическом программировании и разработке пользовательских интерфейсов. Его адрес — ggre@gsoftinc.com.

Модуль подписки в настоящее время недоступен.

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’ам

DirectX и Delphi — введение

Как обычно, начну с оговорок.
Первое – для меня большая проблема перевести некоторые термины. Поэтому я думаю может и не стоит их переводить. :-) Вот список терминов, которые вызывают у меня трудности с переводом:

  • blitting — blit сокращение от «bit block transfer» пересылка блоков данных из одной области видеопамяти в другую.
  • flip – переключение между буферами видеопамяти
  • Surface – «поверхность» – область видеопамяти

Второе – разговор идет о использовании DirectDraw в Delphi. Для того, чтобы воспользоваться DirectX вообще и DirectDraw в частности, нужно, чтобы во-первых DirectX был установлен на компьютере (скачать его можно у Microsoft например, впрочем я не думаю, что для читателя будет проблемой его найти), во-вторых нужны файлы заголовков DirectX – их существует немало, я по-прежднему считаю компонент DelphiX от Hiroyuki Hori – превосходным , кроме того, существует официально поддерживаемые Borland’ом заголовки DirectX, составленные в рамках проекта «JEDI» – скачать их можно с (http://www.delphi-jedi.org/DelphiGraphics/).

Третье – неплохо если Вы имеете некоторое общее представление о работе видеоадаптера (ну очень общее – тонкости не нужны) и еще более общее о COM-технологии (всего-то нужно знать что такое COM- Interface, впрочем и это не обязательно).

DirectDraw – интерфейс DirectX, предназначенный, по существу, для управления видеопамятью.

Прелесть однако заключается в том, что с DirectDraw доступ к видеопамяти становится не зависимым от типа используемой видеоплаты (ну или почти не зависимым). DirectDraw обращается к апаратуре посредством hardware abstraction layer (HAL) – (уровня абстагирования от аппаратуры). Кроме того с помощью hardware emulation layer (HEL) (уровня эмуляции аппаратуры) те возможности, которые не реализованы в данной видеокарте эмулируются программно (к сожалению тут есть пара исключений). Благодаря такому подходу жизнь программиста становится легче и веселее – если, например, видеокарта поддерживает hardware blitting – DirectDraw использует эту возможность через HAL – если нет – эмулирует через HEL (естественно эмуляция всегда медленнее). На рисунке из SDK показаны отношения между DirectDraw, GDI, HAL и HEL.

Как видно из рисунка DirectDraw находится вне GUI. DirectDraw может предоставлять области памяти, с которыми он работает в виде контекста устройства (device context, привычный для Windows-программиста), что позволяет использовать функции GDI для работы с ним (например, выводить текст с помощью функции TextOut)

DirectDraw можно использовать как при рисовании в окне Windows так и при работе в полноэкранном режиме. Я пока буду говорить только о полноэкранном режиме (с эксклюзивным уровнем кооперации).

Режим определяет размер видимой области экрана в пикселах и число бит, требуемых для представления одного пиксела (“глубина цвета ”) (практически все мониторы поддерживают например режим 640ґ480ґ8). Чем больше ширина и высота экрана в пикселах, и чем больше бит требуется для представления одного пиксела, тем больше видеопамяти требуется для режима.

Кроме того видеорежимы бывают палитровыми (palettized) и безпалитровыми (non-palettized). В палитровых режимах “глубина цвета” означает число элементов палитры для данного режима, например 8-битовый палитровый режим означает, что используется палитра, размером 256 элементов. В безпалитровом режиме “глубина цвета” означает число бит для представления цвета (8 бит – 256 цветов, 16 бит – 65535 цветов и т.д.)
Чтобы выяснить какие режимы поддерживает ваша видеокарта можно использовать интефейс IDirectDraw4::EnumDisplayModes.

выясним все поддерживаемые видеорежимы

Чувствуете почему я так люблю Hiroyuki Hori с его компонентом DelphiX? :-) Действительно проще – но, увы, документация у DelphiX очень скудная (и по большей части на японском). Вообще говоря, наверное полезно изучить “классический” способ работы с DirectDraw от JEDI – потом легче пользоваться и DelphiX.

Установить видеорежим можно методом IDirectDraw4::SetDisplayMode.

Установим видеорежим 640x480x8

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


Кстати пример с JEDI-заголовками хорош тем, что демонстрирует создание объекта IDirectDraw получение ссылки на интерфейс IDirectDraw4 вызовом метода QueryInterface из IDirectDraw (IDirectDraw без номера – базовый (и самый старый) интерфейс DirectDraw; IDirectDraw4 – интерфейс из DirectX 6). Вообще объект IDirectDraw – это самая, что ни на есть, сердцевина DirectDraw – он представляет собой некую абстракцию над видеоадаптером – с помощью его методов создаются все остальные объекты DirectDraw (Surface’ы, палитры и т.д.). В принципе можно создавать больше одного объекта IDirectDraw – если у Вас больше одного видеоадаптера и несколько мониторов – в таком случае Вы ровно во столько раз круче меня, на сколько число Ваших видеоадаптеров больше 1-го :-) (для знатоков COM-технологии – для этого при создании объекта DirectDraw нужно передать GUID другого дисплея). Если же монитор у Вас один Вы можете создавать несколько объектов DirectDraw – все они будут управлять одним и тем же видеоадаптером – но мы этот случай рассматривать не будем.

В случае же если Вы используете Hori’вский компонент DelphiX – мучения с инициализацией и деинициализацией сводятся к нулю – достаточно просто разместить на форме компонент DXDraw – он сам позаботится о мелочах жизни, вроде create и release. :-)

Итак, переключаться между видеорежимами мы научились.

Поговорим теперь о Surface’ах. (моя попытка найти хороший русский эквивалент этому слову, не увенчалась успехом). Surface (объект DirectDrawSurface) – в буквальном переводе поверхность, представляет собой линейный участок в видеопамяти. (впрочем можно создавать Surface’ы и в системной памяти – но мы на этом не станем задерживаться) По умолчанию Surface создается так, чтобы получить максимальное быстродействие – в видеопамяти, если ее не хватает – в нелокальной видеопамяти (для плат AGP) а если и ее не хватает то в системной памяти (этот случай самый медленный). Объект DirectDrawSurface кроме указателя на область видеопамяти содержит несколько очень полезных методов (и зверски скоростных) для быстрого переноса квадратика видеоизображения из одного участка Surface’а в другой (blitting), для быстрой смены одного Surface’ а на экране другим – fliping, для работы с палитрами и спрайтами и др.

Ну как удалось мне вас заинтересовать? Ну тогда давайте разберемся – как эти самые замечательные Surface’ы создавать. Перво-наперво скажем что у каждого Surface’а должен быть размер — ширина и высота. Кроме того Surface’ы устроены так, что между началом одной строчки и другой расстояние не всегда равное ширине. Скажем мы создали Surface 640X480X8 – казалось бы между первой строчкой и второй ровно 640 байт – ан нет. Может 640 байт а может и больше (это завист от того парня, который писал драйвер Вашего видеоадаптера). Расстояние между строчками в байтах называется Pitch – переводится как шаг. Почему этот самый Pitch не всегда равен ширине видно из рисунка:

Видите – справа от нашего Front-bufera может быть какой-то кэш, если Вы вздумаете писать напрямую в видеопамять – писать туда (в кэш) строго не рекомендуется (за последствия никто не ручается). Кроме того Pitch, в отличие от ширины измеряется в байтах а не в пикселах.

Раз уж заговорили, про Front-bufer’ы – скажем уж и про то, что один Surface, называемый PrimarySurface, является главным — это тот самый Surface, который был виден на экране в момент когда мы начали создавать эти самые Surface’ы.

Surface’ы могут быть обьединены в так называемые flip-цепочки. Когда происходит flip между Surface’ами – тот Surface, что сейчас на экране, заменяется следующим в цепочке, на следующем flip’е – этот – следующим и т.д. – если дошли до последнего в цепочке – то он заменяется на первый. Ну в обычной жизни цепочка может состоять из всего двух Surface’ ов – при каждом они просто flip’е сменяют друг друга. Обратите внимание – при flip’е смена Surface’ов происходит не в результате пересылки всего их содержимого, а просто в результате изменения указателей на области видеопамяти в видеоадаптере – поэтому flip выполняется очень быстро. (Исключение может быть только в случае если Вы создали столько Surface’ов, что они не поместились в видеопамяти – тогда за дело возьмется HEL – бедняге придется все это эмулировать и скорость будет – не ахти). C помощью flip можно создавать анимацию, выводим какую-то картинку, затем в BackBuffer’e – чуть-чуть меняем эту картинку, вызываем flip, чуть-чуть меняем картинку в BackBuffer’e, вызываем flip и т.д. в цикле.

Вот пример создания Flip-цепочки из двух Surface’ов, обьектов IDirectDrawSurface4.

(Ссылки на два созданных Surface’а сохраняются в переменных FPrimarySurface и FbackSurface)
(этот пример взят из моей демо-программульки, которую Вы может скачать здесь 169K)

Создали Surface’ы. Теперь было бы интересно что-нибудь на них нарисовать. Интересно также попробовать писать прямо в видеопамять.
Получить указатель на область видеопамяти Surface’а можно вызвав метод Lock – он вернет указатель в структуре типа TDDSURFACEDESC2, которую получает в качестве параметра.

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

Обратите внимание — какой я аккуратный – перехожу между строчками, учитывая Pitch. Да кстати – я просто демонстрирую как обратится к каждому байту видеопамяти Surface’a на самом деле если нужно закрасить весь Surface одним цветом то заносить значения в каждый байт слишком медленно – для этого можно воспользоваться методом IDirectDrawSurface4.Blt, передав ему флаг DDBLT_COLORFILL. Кроме того можно выводить на Surface и привычными функциями GDI – TextOut’ом например:

Небольшое лирическое отступление – между вызовами LOCK и UNLOCK, а также между GetDC и ReleaseDC выполнение всех других программ останавливается (в том числе и отладчика). Отсюда выводы – первое – не стоит делать что-то слишком долго между этими вызовами, второе, отладить программу пошагово между этими вызовами – невозможно (если только Вы не вооружились Kernel-debuger’ом).

Теперь попробуем flip’ануть наши Surface’ы. Переключимся на другой Surface

Метод Flip может отказаться flip’овать и вернуть, среди прочих, такие коды ошибок:

  • DDERR_NOEXCLUSIVEMODE – этот код возврата означает, что наша программа потеряла эксклюзивный режим. Произойти такое может, если мы flip’уем в цикле по таймеру, а пользователь зачем-то ушел из нашей программы, свернув ее или нажав Alt-TAB. В таком случае, чтобы зря не тратить процессорные циклы, лучше подождать его возвращения, вызывая функцию Sleep(0) или WaitMessage.
  • DDERR_SURFACELOST – потеря Surface’ов пользователь уходил, но вернулся, Surface’ы нужно забрать назад, вызвав IDirectDraw4.RestoreAllSurfaces, содержимое их придется восстановить.

Все вышесказанное касается классического стиля использования DirectDraw в стиле С от JEDI. Поклонники же Hori’вского набора DelphiX могут поэкспериментировать c Surface’ами используя TDXDraw.DDraw.SurfaceCount, TDXDraw.DDraw.Surfaces, TDXDraw.Flip – вместе с набором компонент распространяются отличные примеры.

Я очень рад, что Вы дочитали до этого места (если Вы просто пролистали в конец, не читая, сделайте вид, что это не так, порадуйте меня, старика) :-).
На этом пока все. Если Вы заинтересовались – скачайте демо-программку и поэкспериментируйте.

Пишите мне – [email protected] или [email protected] – с удовольствием приму Ваши пожелания и предложения (особенно если предложите какую-нибудь работу) :-).

Direct Draw 1.0

Размер: 159 Кб

Скачать

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

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

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

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

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

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

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

    Что такое DirectDraw?

    Ad Content

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

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

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

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

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

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

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

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

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

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

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

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