Delphi GFX


Терминология


Перед началом работы с DirectX необходимо остановиться на терминологии.

Поверхность (surface) - участок видеопамяти, который используется для хранения различных картинок. Все видеобуферы ссылаются на поверхности. Поверхность, которая отображается на экране в текущий момент называется основной (primary) поверхностью. Эта поверхность занимает столько памяти, сколько нужно для текущего разрешения и глубины цвета. Так, если установлен видеорежим 640 x 480 x 256 цветов (8 bpp), тогда основная поверхность будет занимать 307200 байт видеопамяти. Обычно вам нужна еще одна поверхность такого же размера, что и основная, используемая для флиппинга (что это такое будет объяснено чуть позже). Это значит, что нужно 614400 байт видеопамяти просто чтобы начать работать, не загружая никаких картинок. Если количества видеопамяти не хватает, поверхности будут создаваться в системной памяти, теряя преимущества аппаратного ускорения. В настоящий момент вам необходима видеокарта с 2MB видеопамяти - это абсолютный минимум для простых игр.

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

Анимация с флиппингом страниц (page flipping animation) - для понимания этой техники вам достаточно нарисовать что-нибудь в блокноте и быстро пролистать страницы. При этом получится изменяющаяся картинка. В нашем случае сцена создается копированием картинок и спрайтов на поверхность (буфер), которая затем отображается на экране. Флиппинг - очень быстрая операция из-за того, что реально не происходит копирования больших объемов информации. При флиппинге происходит изменение одного регистра видеокарты, который содержит адрес участка памяти, отображающегося в текущий момент. В основном флиппинг состоит из 3-х шагов:
1. Создание сцены в буфере.
2. Переключение буфера для отображения, при этом поверхность, которая отображалась до этого становится буфером.
3. Повторяем с шага 1.

Кадры в секунду (frames per second) - обычно записывается как FPS, и обозначает количество кадров анимации, необходимое для получения плавного реального движения. Обычно для игр достаточно 24-25 FPS для получения приемлемых результатов (хотя для некоторых игр это значение может быть еще меньше).

Эффект разрывания экрана (tearing) - Большинство мониторов обновляют экран с частотой примерно 70 раз/сек (70 Гц) сверху вниз. Проблема возникает когда вы пытаетесь отобразить новую картинку где-то в середине процесса обновления экрана. При этом верхняя половина экрана отображает старую картинку, а нижняя - новую. Во время существования DOS для предотвращения этого эффекта вам нужно было бы синхронизироваться с вертикальной разверткой. DirectX освобождает вас от этой процедуры.

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

Отметим, что каждый фрейм отображает определенный угол поворота объекта. Если показывать эти картинки одна за другой, то получится что-то тип этого:

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

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

Теория цвета - цвет в Windows обычно представляется моделью RGB (красный, зеленый, синий). Используя эти три основных цвета позволяет получить все мыслимые оттенки комбинацией основных. Обычно цвет хранится в виде 3-х байтов - каждый байт представляет относительную интенсивность основного цвета (от 0 до 255 включительно).

В Delphi цвет представляется в виде класса TColor, объявленном в модуле Graphics. Вы можете определить цвет используя консттанты типа clBlue, clLime и т.п. или определяя TColor как 4-хбайтовое число, где 3 младших байта представляют RGB цвет. Так, 0x00FF0000 - синий, 0x0000FF00 - зеленый, 0х000000FF - красный, 0x00000000 - черный, 0х00FFFFFF - белый и т.д. По поводу старшего байта в помощи по VCL сказано: "Если старший байт равен $00, получаемый цвет - ближайший подходящий цвет системной палитры, если он равен $01 - берется ближайший цвет из текущей палитры, если $02 - подбирается ближайший цвет, соответствующий контексту устройства".




Начало  Назад  Вперед