Direct draw термины и концепции пример реализации


Содержание

DirectDraw

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

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

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

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

DirectDraw — DirectDraw, DirectX … Universal-Lexikon

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

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

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

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

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

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

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

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

Direct draw термины и концепции пример реализации

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

Видеорежимы

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

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

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

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

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

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

Поверхности

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

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

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

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

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

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

Блиттинг

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

Direct draw термины и концепции пример реализации

Дата публикации статьи: 10.06.2006 11:23


ГЛАВА 4. Пример работы с DirectDraw в среде Visual Basic

Visual Basic является в первую очередь клиентом COM и такой графический API как DirectX, являющийся сервером COM, так же предоставляет свои интерфейсы для программирования графики. В API GDI32 предусмотрены функции для работы с изображениями на основе массива пикселей, но для быстрой работы с битовой графикой Microsoft предлагает API DirectX, основанный на технологии COM. В седьмой версии DirectX за работу с битовой графикой отвечает интерфейс DirectDraw, который физически находятся в библиотеках динамической компоновки dx7vb.dll (DirectX версии 7). (Если Вы работаете в WinXP – DirectX7 уже установлен)
Для работы с DirectX часто достаточно только интерфейса отвечающего за битовую графику, а именно DirectDraw. Инициализация DirectDraw требует ряда поэтапных стандартных действий, описанных в приведенной ниже простой программе.
1.Создайте проект Standard EXE (см. проект папка N8/). Подключите к проекту библиотеку типов DirectX:
Project/References/DirectX7 for VB Type Library (Рис. 1)

2. Введите в раздел General после Option Explicit следующий код:

В переменной dx хранится ссылка на “верхний” объект – собственно на всю библиотеку DirectX7. Объектная переменная dd нужна для получения доступа к сервисам предоставляемым интерфейсом DirectDraw, а переменная di для доступа к DirectInput – интерфейсу обеспечивающему работу мыши и клавиатуры.
3.Введите следующий код в событие формы Private Sub Form_Load():

В первой части кода приведенного в событии Form_Load производится инициализация объектных переменных dd,di и diDev. Интерфейс доступ к которому предоставляет переменная diDev отвечает в данном случае за клавиатуру (флаг GUID_SysKeyboard). От di можно так же “родить” мышь и джойстик которые являются устройствами (DEVICE) поддерживаемыми технологией DirectX(тип — Dim diDev As DirectInputDevice ).
Примечание. В первой версии DirectX которая называлась Game SDK работа с мышью и клавиатурой производилась через стандартные оконные сообщения Windows, а DirectInput нужен, чтобы обойти сообщения окну. В VB для работы в форме можно использовать стандартные события мыши и клавиатуры. Хотя они и медленней, но если Вы не пишите высокоскоростную игру стандартные сообщения вполне подойдут.
В функции SetCooperativeLevel устанавливается разрешение экрана 800/600 пикселей и цветовой режим 16 бит на пиксель.
Примечание. Режим 265 цветов (работа с палитрами) в данной статье не рассматривается, хотя все файлы формата “ВМР” в примерах являются палитровыми. Просто если установить режим 16бит/пиксель все преобразования по правильному отображению палитры за Вас сделает Windows.
Найдите функции Set OsnovaBMP = dd.CreateSurfaceFromFile(App.Path & «\Osnova.bmp», ddsdOsnovaBMP) и Set SpriteBMP = dd.CreateSurfaceFromFile(App.Path & «\Fase.bmp», ddsdSpriteBMP), прежде чем ими воспользоваться и загрузить массивы пикселей в память из файлов, необходимо создать поверхности с которыми может работать DirectDraw (тип — DirectDrawSurface7). В данном примере будет четыре поверхности: Dim Prim As DirectDrawSurface7-первичная поверхность; Dim PrimBufer As DirectDrawSurface7- буфер прикрепленный к первичной поверхности на котором в памяти строится картинка перед выводом; Dim OsnovaBMP As DirectDrawSurface7 — картинка для фона созданная из файла (Osnova.bmp); Dim SpriteBMP As DirectDrawSurface7 — картинка для лица человечка(Fase.bmp). Создают поверхности функции описанные в интерфейсе DirectDraw – CreateSurface(для первичной поверхности и ее буфера) и CreateSurfaceFromFile(поверхности на основе файлов), которым в качестве параметров передаются структуры с описанием поверхностей(тип – DDSURFACEDESC2).
Найдите в коде примера две функции BltFast – здесь происходит загрузка картинок(спрайтов) в первичный буфер. В функции Flip буфер “выстреливается” на свою первичную поверхность. Если этот процесс “зациклить” меняя при этом координаты вывода спрайтов в функциях BltFast — получится анимация. Изменение координат в функциях BltFast может инициализировать нажатие клавиш, мыши или событие таймера.
4.Добавьте на форму элемент “Timer” со следующим обработчиком события:

Нажимая на клавиши “1” и “2” лицо человечка будет перемещаться. Обратите внимание, что один глаз у человечка “закрыт”. Происходит это потому, что прозрачными будут только черные пиксели файла из файла Fase.bmp. Отвечает за прозрачность черного цвета следующий код:

5.Что бы безопасно выйти из приложения, с помощью клавиши “Esc”, добавьте следующий обработчик :

Если не хотите связываться с DirectInput обработку нажатия клавиш для перемещения человечка можно поместить в событие Form_KeyPress (коды клавиш: “Esc”- код 27; “1”- код 49; ”2”- код 50). На рисунке 2 представлено работающее приложение, описанное выше, оно не предусматривает наличие привычного для Windows-программы окна (см. проект папка N8/).

Для создания оконных приложений DirectX, последовательность действий должна быть несколько иной. Приведем простой пример приложения DirectX обладающего окном (см. проект папка N9/). Приложение в работе представлено на рисунке 3.

При нажатии на кнопку “PageUp”(стрелка вверх) винтовка начинает стрелять. Как и для безоконного приложения для каждого спрайт нужно создать поверхность. Для спрайта выстрела создается последовательность рисунков. На рисунке 4 представлена последовательность из файла “gun.bmp”.

Полностью код приложения Вы можете просмотреть в среде Visual Basic. Приведем ключевые моменты. Основные глобальные объекты создаются как было показано в прошлом примере, но отсутствует DirectInput. Добавляется глобальное объявление переменной Dim objDDClip As DirectDrawClipper которая инициализируется в событии Form_Load:

Это нужно для ограничения области вывода графики прямоугольной областью которое занимает окно (так как приложение оконное). Обратите внимание как изменились флаги в функции SetCooperativeLevel, а так же на вызов функции SetClipper через объект поверхности objDDScreen (которой соответствует первичная поверхность Prim из прошлого примера). После считывания этого кода приложение знает о существовании и размерах окна на которое выводится графика.
Последние на что следует обратить внимание это вызов функции Call objDX.GetWindowRect(Picture1.hWnd, rPrim). Она вызывается перед вызовом функции блитинга для “подложки” на которую лягут спрайты. Это вызвано тем, что нужно знать положение ограничивающего прямоугольника окна(ведь окно может перемещаться по экрану).
Важным отличием от предыдущего примера является добавление в событие Form_Load “бесконечного” цикла Do While в котором происходит “зацикливание”, необходимое для анимации.
Изменилось и назначение таймера – теперь в нем происходит последовательная выборка вспышек выстрелов. Такая техника является заменой многопоточности в приложениях на VB.
В следующем примере (см. проект папка N10/) на этом принципе построено приложения которое может являться прототипом несложного тренажера или системой подсказки оператора, управляющего техническим процессом. Приведем относительно простой пример — за основу возьмем ввод в действие гипотетической атомного установки. Экран программы приведен на рисунке 5

Код этой программы имеет значительный размер по сравнению с приложениями приведенными ранее, поэтому рассмотрим только некоторые из его отличительных особенностей. Программа разделена на четыре модуля – модуль инициализации DirectDraw; модуль для всех функций BltFast выводящих спрайты на буфер; модуль для объявления функций API, переменных и структур(тип RECT и POINTAPI); модуль в котором находится стартовая функция Main(), загружается форма и включается “бесконечный” цикл Do While. Программа состоит из трех форм Visual Basic. Первая форма реагирует на стандартные события мыши и клавиатуры, на ней так же установлены два таймера(имитируют многопоточность). Две другие формы служат хранилищами ресурсов графики.
Примечание. Часто для хранения ресурсов используют DLL.
Ресурсы нужны для создания поверхностей DirectDraw. В каталоге приложения Вы не найдете файлов типа *.BMP и соответственно поверхности не могут быть созданы с помощью функции CreateSurfaceFromFile, в место этого применен функция CreateSurface. В тексте программы это выглядит так:

Илон Маск рекомендует:  Выражения и присваивания

Как видите и у поверхности DirectDraw имеется контекст устройства. Получить доступ к ресурсам вспомогательных форм можно было бы и таким способом:

В этом случае в памяти создается образ из массива пикселей на основе которого строится совместимый контекст памяти, передаваемый функции API BitBlt. Эта функция заполняет поверхность DirectDraw пикселями.
Вращающиеся стрелки приборов созданы с помощью таких функций GDI как: Polygon, SelectObject, CreatePen, DeleteObject, CreateSolidBrush. Изменение координат стрелки в функции Polygon производилось с помощью нехитрых тригонометрических преобразований вида:

Все навыки которые Вы получите изучая графические примитивы GDI с большой пользой можно использовать и в DirectDraw. Если бы не удалось воспользоваться GDI для рисования стрелок, пришлось бы применять спрайт для каждого положения шкалы кругового прибора или “придумывать математику” вращения изображения попиксельно, а без искажений сделать это очень трудно.
Примечание. Платформе .NET использует для работы с графикой интерфейс GDI+, который имеет быстрые функции для поворота битовой графики.

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

НАСТРОЙКИ.

СОДЕРЖАНИЕ.

СОДЕРЖАНИЕ

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

Разработка системы частиц на платформе DirectX 9. Часть I

Данный пост будет о том, как разработать свою собственную, и достаточно производительную (на моем компьютере спокойно отрисовывается и анимируется 1 000 000 частиц в реальном времени), систему частиц. Писать будем на языке C++, в качестве платформы будет использован DirectX 9.

Вторая часть доступна здесь.

Пример одного из кадров визуализации (кликабельно):

Для начала стоит сказать почему именно C++ и DirectX9, а не, скажем, XNA, или вообще GDI. Перед тем как определиться, я рассмотрел\попробовал много вариантов: HTML+JS (когда разрабатывал концепцию), С# и GDI, C++ и GDI, С# и XNA. Все из перечисленных вариантов не позволили достичь необходимой производительности (реал-тайм рендеринг более 50000 частиц), поэтому я стал рассматривать более серьезные варианты. Первое что пришло в голову было DirectDraw, но его давно никто не разрабатывает, поэтому выбор пал на Direct3D. Можно было использовать и OpenGL, но D3D мне как-то ближе.

0. Концепция и требования

Система будет рисовать и анимировать частицы. Анимацию будем производить по некой формуле (в качестве примера я использовал Закон всемирного тяготения). С системой можно взаимодействовать из вне, передавая какие-то данные в реальном времени.

Требования.

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

Пойдем по-порядку:
1. Производительность. Пожалуй, чего-то быстрее чем C\C++ будет сложно найти, да и Direct3D широко применяется при разработке компьютерных игр. Нам его возможностей точно хватит.
2. Отрисовка в реальном времени. Собственно Direct3D (OpenGL) для этого и используют. Выбранный кандидат подходит.
3. Гибкость в настройке. В DirectX есть такая замечательная вещь, как шейдеры. Можно реализовать что угодно, не переписывая больше ничего, кроме них.
4. Спрайты. В DirectX ими достаточно легко пользоваться. Подходит.
5. Эффекты, пост-эффекты. Для реализации этого нам помогут шейдеры.

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

Все теоретические вопросы мы решили, теперь перейдем к реализации.

1. Инициализация Direct3D и создание камеры

Для работы нам понадобится собственно среда разработки\компилятор и DirectX SDK

Первое, что нужно сделать это создать объект Direct3D9, после устройство для вывода и окно, где и будет все отображаться.

В коде выше мы создаем обычное окно, в котором будет происходить отрисовка. Далее объект Direct3D. И наконец объект устройства, который мы и будем использовать для рисования.

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

Еще следует не забывать об установки матриц проекции и камеры. Если коротко, то матрица проекции используется для преобразование 3D данных в 2D, а камера описывает то, что мы видим и куда смотрим.

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

2. Создания частиц и буфера для них

Все приготовления мы выполнили, осталось лишь создать частицы и приступить к рисованию.

VertexData используется для хранения данных о частице в GPU (вершинный буфер), и содержит координаты нашей частицы в пространстве. Эта структура имеет особый формат, и фактически графический процессор будет брать из нее сведения что и где рисовать.
Particle будет представлять нашу частицу, и содержит координаты и скорость.
В particles же будут хранится сведения о всех наших частицах. Этой информацией мы будем пользоваться для расчетов движения частиц.


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

3. Отрисовка частиц

Теперь частицы необходимо нарисовать. Делается это очень просто:

Одно важно замечание: BeginScene() необходимо вызывать каждый раз перед началом рисования, а EndScene() после окончания.

Анимация

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

На этом первая часть статьи подошла к концу. В следующей части будет описано текстурирование частиц, вершинные и пиксельные шейдеры, а так же эффекты и пост-эффекты. Так же в конце 2-ой части вы увидите ссылки на демонстрацию и её полный исходный код.

Direct draw термины и концепции пример реализации

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

DirectX

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

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

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

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

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

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

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

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

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

Direct draw термины и концепции пример реализации

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

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

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

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

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

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

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

DirectDraw API

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

1. command /E:1000

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

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

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

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

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

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

Основы DirectDraw (DDEX1)

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

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

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

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

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

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

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


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

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

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

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

Direct draw термины и концепции пример реализации

ГОСТ Р 56862-2020

НАЦИОНАЛЬНЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИ

Система управления жизненным циклом

РАЗРАБОТКА КОНЦЕПЦИИ ИЗДЕЛИЯ И ТЕХНОЛОГИЙ

Термины и определения

Life cycle management system. Product conception and technologies development. Terms and definitions

Дата введения 2020-10-01

Предисловие

1 РАЗРАБОТАН Научно-исследовательским институтом стандартизации и сертификации «Лот» Федерального государственного унитарного предприятия «Крыловский государственный научный центр» (НИИ «Лот» ФГУП «Крыловский государственный научный центр»), Федеральным государственным унитарным предприятием «Научно-исследовательский институт стандартизации и унификации» (ФГУП «НИИСУ»)

2 ВНЕСЕН Техническим комитетом по стандартизации ТК 323 «Авиационная техника»

4 ВВЕДЕН ВПЕРВЫЕ

5 ПЕРЕИЗДАНИЕ. Декабрь 2020 г.

Правила применения настоящего стандарта установлены в статье 26 Федерального закона от 29 июня 2015 г. N 162-ФЗ «О стандартизации в Российской Федерации» . Информация об изменениях к настоящему стандарту публикуется в ежегодном (по состоянию на 1 января текущего года) информационном указателе «Национальные стандарты», а официальный текст изменений и поправок — в ежемесячном информационном указателе «Национальные стандарты». В случае пересмотра (замены) или отмены настоящего стандарта соответствующее уведомление будет опубликовано в ближайшем выпуске ежемесячного информационного указателя «Национальные стандарты». Соответствующая информация, уведомление и тексты размещаются также в информационной системе общего пользования — на официальном сайте Федерального агентства по техническому регулированию и метрологии в сети Интернет (www.gost.ru)

Введение

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

1 Область применения

Настоящий стандарт устанавливает перечень терминов и определений для общих положений разработки концепции изделия и технологий (далее — продукта).

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

Настоящий стандарт предназначен для разработки концепций и технологий.

2 Термины и определения

2.1 аванпроект (preliminary design): Комплекс теоретических, экспериментальных исследований и проектных работ по технико-экономическому обоснованию возможности создания изделия, удовлетворяющего требованиям заказчика

2.2 изделие (product): Предмет, созданный в ходе целенаправленной деятельности.

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

[Р 50.1.031-2001 [2], статья 3.4.16]

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

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

[ГОСТ 27.002-89, статья 1.1]

бизнес-процесс (business process): Совокупность последовательно или/и параллельно выполняемых операций, преобразующая материальный или/и информационный потоки в соответствующие потоки с другими свойствами. Бизнес-процесс протекает в соответствии с управляющими директивами, вырабатываемыми на основе целей деятельности. В ходе бизнес-процесса задействуют финансовые, энергетические, трудовые и материальные ресурсы и соблюдают ограничения со стороны других бизнес-процессов и внешней среды. Частными случаями бизнес-процесса являются организационно-деловые, технологические и другие процессы.

[Р 50.1.031-2001 [2], статья 3.4.2]

валидация (validation): Подтверждение на основе представления объективных свидетельств того, что требования, предназначенные для конкретного использования или применения, были выполнены.

[ГОСТ Р ИСО 9000-2011*, статья 3.8.5]

________________
* Вероятно, ошибка оригинала. Следует читать: ГОСТ Р ИСО 9000-2008, здесь и далее по тексту. — Примечание изготовителя базы данных.

верификация (verification): Подтверждение посредством предоставления объективных свидетельств того, что установленные требования были выполнены.

[ГОСТ Р ИСО 9000-2011, статья 3.8.4]

менеджмент (management): Скоординированная деятельность по руководству и управлению организацией.

[ГОСТ Р ИСО 9000-2011, статья 3.2.6]

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

[ГОСТ Р 54147-2010, статья 3.1.30]

стадия жизненного цикла (life cycle stage): Часть жизненного цикла, выделяемая по признакам характерных для нее явлений, процессов (работ) и конечных результатов.

[ГОСТ Р 56136-2014, статья 3.17]


этап жизненного цикла (life cycle milestone): Часть стадии жизненного цикла, выделяемая по признакам моментов контроля (контрольных рубежей), в период течения которых предусмотрена проверка характеристик проектных решений типовой конструкции и (или) физических характеристик экземпляров изделий.

[ГОСТ Р 56136-2014, статья 3.18]

организация (organization): Коллектив работников, в распоряжение которых предоставлены необходимые средства, с распределением ответственности, полномочий и взаимоотношений.

[ГОСТ Р 54147-2010, статья 3.2.21]

соглашение (agreement): Взаимное признание сроков и условий, в соответствии с которыми осуществляются рабочие отношения.

[ГОСТ Р ИСО 15288-2005*, статья 4.3]

________________
* Вероятно, ошибка оригинала. Следует читать: ГОСТ Р ИСО/МЭК 15288-2005, здесь и далее по тексту. — Примечание изготовителя базы данных.

процедура (procedure): Установленный способ осуществления деятельности или процесса.

[ГОСТ Р 54147-2010, статья 3.2.32]

процесс (process): Совокупность взаимосвязанных или взаимодействующих видов деятельности, преобразующих входы в выходы.

[ГОСТ Р ИСО 9000-2011, статья 3]

инжиниринг (engineering): Деятельность исследовательского, проектно-конструкторского, расчетно-аналитического характера, подготовка технико-экономических обоснований проектов, выработка рекомендаций в области организации.

[ГОСТ Р 54147-2010, статья 3.1.14]

2.17 инициация (initiation): Деятельность, состоящая в выборе цели инновации, постановке задач, поиске идеи инновации, ее технико-экономическом обосновании и в материализации идеи в продукт или товар (имущество, документ имущественного права, документ по операции).

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

[ГОСТ Р 54147-2010, статья 3.1.19]

роли (roles): Обязанности, ответственность, полномочия, договоренности по представлению отчетности и другие аспекты, необходимые для выполнения работы.

[ГОСТ Р 54147-2010, статья 3.7.43]

система (system): Совокупность взаимосвязанных и взаимодействующих элементов.

[ГОСТ Р ИСО 9000-2011, статья 3.2.1]

элемент системы (system element): Представитель совокупности элементов, образующих систему.

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

[ГОСТ Р ИСО 15288-2005, статья 4.18]

участники проекта (stakeholders): Лица, заинтересованные в проекте, то есть члены группы, заказчики, внутренние и внешние стороны и ответственные за принятие решений.

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

[ГОСТ Р 54147-2010, статья 3.7.45]

управление проектом (project administration): Планирование, организация и контроль трудовых, финансовых и материально-технических ресурсов проекта, направленные на эффективное достижение целей проекта.

[ГОСТ Р 54869-2011, статья 3.17]

проект (project): Комплекс взаимосвязанных мероприятий, направленный на создание уникального продукта или услуги в условиях временных и ресурсных ограничений.

[ГОСТ Р 54869-2011, статья 3.12]

программа (program): Ряд связанных друг с другом проектов, управление которыми координируется для достижения преимуществ и степени управляемости, недоступных при управлении ими по отдельности.

[ГОСТ Р 54871-2011, статья 3.11]

контрольное событие программы (program milestone): Существенное событие программы, отражающее получение измеримых результатов программы или получение запланированных выгод.

[ГОСТ Р 54871-2011, статья 3.7]

2.27 риск проекта/программы (project/program risk): Вероятное для проекта/программы событие, наступление которого может как отрицательно, так и положительно отразиться на результатах проекта/программы.

2.28 оценка риска (risk assessment): Всесторонняя оценка вероятности и степени возможного получения неблагоприятного результата.

анализ риска (risk analysis): Систематическое использование информации для определения источников и оценки риска.

[ГОСТ Р 54147-2010, статья 3.4.25]

2.30 платформа (platform) : Мобильный носитель системы или комплексов военной техники (вооружения, оружия).

жизненный цикл изделия (product lifecycle): Совокупность явлений и процессов, повторяющаяся с периодичностью, определяемой временем существования типовой конструкции изделия от ее замысла до утилизации или конкретного экземпляра изделия от момента завершения его производства до утилизации.

[ГОСТ Р 56136-2014, статья 3.16]

технологии непрерывной информационной поддержки жизненного цикла продукции (Continuous Acquisition and Life cycle Support, CALS): Информационные технологии описания изделий, производственной среды и процессов, протекающих в этой среде. Данные, порождаемые и преобразуемые этими информационными технологиями, представляются в виде, оговоренном в нормативном документе информационной поддержки жизненного цикла продукции, и служат для обмена или совместного использования различными участниками жизненного цикла продукции.

[Р 50.1.031-2001 [2], статья 3.1.2]

2.33 конфигурация (configuration): Совокупность всех характеристик продукции, изделия или объекта, установленных в требованиях к проектированию, производству, проверкам, эксплуатации и обслуживанию.

2.34 системная инженерия (system engineering): Совокупность знаний, методик, принципов и подходов к решению производственных и управленческих задач, основанных на представлении об объектах и субъектах работ как о взаимодействующих системах и требованиях максимальной интеграции информации, управленческих решений и взаимодействия участников.

2.35 ключевая контрольная точка (веха) (quality gate): Контрольная точка внутри жизненного цикла продукта, на которой принимаются решения о ходе дальнейшей разработки.

2.36 индикатор (indicator): Доступная наблюдению и измерению характеристика изучаемого объекта, процесса или состояния объекта в форме наиболее удобной для восприятия, позволяющая судить о других характеристиках, недоступных непосредственному исследованию.

контрольное событие проекта (project milestone): Существенное событие проекта, отражающее получение измеримых результатов проекта.

Примечание — Контрольное событие в отличие от работ проекта не имеет характеристик длительности и трудоемкости.

[ГОСТ Р 54869-2011, статья 3.7]

2.38 концепция продукта (product concept): Документ с аналитическими, конструкторскими и производственными проработками, на основе которого можно принимать решение на разработку продукта.

2.39 технические данные (technical data): Информация о свойствах и характеристиках продукции.

технический электронный документ; ДТЭ (technical electronic document): Электронный документ, содержательная часть которого включает технические данные.

[Р 50.1.031-2001 [2], статья 3.2.23]

интегрированная логистическая поддержка; ИЛП (integrated logistics support; ILS): Методика управления, нацеленная на оптимизацию затрат в течение жизненного цикла изделия. Она включает элементы влияния на процесс проектирования изделия с целью определения условий протекания постпроизводственных стадий жизненного цикла изделия, выполнение которых обеспечит максимальную поддержку изделия в период его эксплуатации.

[Р 50.1.031-2001 [2], статья 3.9.1]

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

[ГОСТ Р 55847-2013 , статья 3.1.7]

2.43 уровень готовности технологий; УГТ (technology readiness level; TRL): Степень развития разрабатываемой технологии с целью ее внедрения в производство конечного продукта.

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