Elite Games - Свобода среди звезд!

Уроки для программистов - Графическое устройство (класс GraphicsDevice)

Что ж... Продолжим.

Внимание! Для нормального восприятия данной статьи читатель должен знать основы объектно-ориентированного программирования.

Итак. Сегодня мы рассмотрим класс, без которого невозможно создать ни одно графическое приложение с помощью библиотеки XNA framework...

GraphicsDevice

GraphicsDevice находится в пространстве имён Microsoft.Xna.Framework.Graphics Что касается предназначения данного класса, то тут всё просто: GraphicsDevice инкапсулирует в себе все свойства и методы (ну или почти все), необходимые для взаимодействия с графическим адаптером.
Для программиста GraphicsDevice и является тем графическим адаптером, так как он инкапсулирует все свойства и методы, присущие видеокарте. Простыми словами именно с помощью экземпляра этого класса программа может узнать всё о видеокарте (поддерживаемые форматы, технологии и тд), провести операции рендеринга какой-либо модели, задать опции вывода на экран изображения (разрешение, глубина цвета, частота обновления) и тд и тп
Вобщем, если вы хотите работать с видеокартой, то вы будете тем или иным образом работать с экземпляром этого класса.

Конструктор класса GraphicsDevice имеет такой вид


GraphicsDevice(GraphicsAdapter adapter, DeviceType deviceType, IntPtr renderWindowHandle, PresentationParameters presentationParameters)


Опишем каждый из параметров конструктора

Название

Значение

adapterЭкземпляр класса GraphicsAdapter, соответствующий видеокарте, которую мы хотим использовать в нашем приложении. Дело в том, что в современных компьютерах часто стоят несколько видеокарт. Что бы установить значение по-умолчанию достаточно передать GraphicsAdapter.DefaultAdapter
deviceTypeОпределяет тип устройства. Более подробно это перечисление описывается ниже
renderWindowHandleДескриптор окна или компонента, на поверхность которого проводится рендеринг
presentationParametersСтруктура, хранящая настройки изображения. Подробнее смотрите далее


Расмотрим параметры подробней.

adapter

Экземпляр класса GraphicsAdapter инкапсулирует все основные свойства видеокарты. С помощью него можно узнать какие технологии поддерживает видеокарта, какие режимы работы монитора поддерживаются (разрешение, глубина цвета, частота обновления) и тд.
Подробннее GraphicsAdapter будет рассмотрен в следующих статьях. Сейчас же стоит упомянуть, что перечень всех видеокарт, доступных на компьютере, можно найти в статической коллекции Adapters, находящейся в классе GraphicsAdapter. Так же стоит упомянуть о том, что получить экземпляр GraphicsAdapter, соответствующий видеокарте по-умолчанию можно через статическое свойство DefaultAdapter класса

deviceType

Перечисление, котрое может принимать три значения

DeviceType.HardwareАппаратное устройство.
DeviceType.NullReferenceНуль-устройство, игнорирующее все поступающие команды. Применяется для проверки быстродействия программы на бесконечно быстрой видеокарте
DeviceType.ReferenceУстройство эмулируется средствами DirectX SDK. Используется для эмуляции функциональности, не поддерживаемой видеокартой (Например, шейдеры на Geforce 4 MMX, которая их не поддерживает). Обычно быстродействие в этом режиме не превышает пары кадров в секунду


renderWindowHandle

Дескриптор явлвяется уникальным индетефикатором окна или компонента в системе. В случае использования Windows Forms дескриптор можно получить таким образом (объект окна или компонента).Handle

presentationParameters

В дальнейшем класс PresentationParameters будет рассматриваться подробней.
Сейчас же стоит рассмотреть те свойства, которые будут нам нужны в близжайшее время.
IsFullScreenЕсли выбрать значение true, то приложение будет работать в полноэкранном режиме. Если false — изображение будет выводится на ранее указанный компонент или окно
BackBufferWidthШирина графического буфера в пикселах. Обязательно задавать при использовании полноэкранного режима
BackBufferHeightВысота графического буфера в пикселах. Обязательно задавать при использовании полноэкранного режима
BackBufferFormatФормат пиксела в вспомогательном графическом буфере
BackBufferCountКоличество вспомагательных графических буферов. Если поставить значение 0, то изображение будет рисоваться сразу на экран. Если 1 или больше, то сначала изображение будет рендерится в буфер, а потом выводится на экран (борьба с миганием экрана)
FullScreenRefreshRateInHzЧастота обновления экрана в полноэкранном режиме
SwapEffectУказывает каким образом проходит переключение между буферами при двойной (один вспомогутальный буфер) и тройной (два вспомогательных буфера) буферизации. Обычно устанавливают значение SwapEffect.Discard, что даёт возможность видеократе самой определить оптимальный вариант переключения


Теперь можно перейти к примеру инициализации графического устройства

Для этого нам нужно будет создать приложение Windows Forms (Windows Forms Application)

После этого добавим ссылку на библиотеку Microsoft.XNA.Framework.dll в проект командой «AddReference»

После этого пропишем нужное пространство имён

using Microsoft.XNA.Framework.Graphics;

Теперь необходимо создать обработчик на событие Load формы


private void OnLoad(object sender, EventArgs e)
{
Создаём экземпляр класса PresentationParameters
PresentationParameters presentationParameters = new PresentationParameters();
Указываем, что мы хотим получить оконный режим
presentationParameters.IsFullScreen = false;
Определяем один вспомогателбный буфер (двойная буферизация)
presentationParameters.BackBufferCount = 1;
Устанавливаем режим переключения между буферами «на выбор видеокарты»
presentationParameters.SwapEffect = SwapEffect.Discard;

Создаём новое устройство, указывая, что будет использоваться видеокарта по-умолчанию (GraphicsAdapter.DefaultAdapter)
в режиме аппаратного ускорения (DeviceType.Hardware)
в случае оконного режима, вывод будет осуществлятся на текущую форму (this.Handle)
а так же передаём параметры изображения (presentationParameters)
GraphicsDevice device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, this.Handle, presentationParameters);
}


Устройство готово. Теперь, для пробы, нужно сделать что-нибудь простое с ним. Как на счёт закрасить окно синим цветом?

Для этого нам нужно создать обработчик события формы Paint


public void OnPaint(object sender, PaintEventArgs e)
{
Очищаем форму синим цветом. Класс Color используется не стандартный, а собственный из библиотеки, что вызвано требованиями кроссплатформенности
device.Clear(Microsoft.Xna.Framework.Graphics.Color.Blue);
Вызываем метод, выводущий содержание буфера на экран
device.Present();
}


Ну как? Есть синее окно? Нет?

Проблема в том, что событие формы Paint не обязательно вызывается сразу после загрузки. Что бы быть уверенными в том, что форма окрасится сразу в синий допишем одну строчку в конец обработчика события Load :


this.Invalidate();


Ну и естестванно тут вы можете взять исходники примера для этого урока.
Lefi Mind
К началу раздела | Наверх страницы Сообщить об ошибке
Уроки для программистов - Графическое устройство (класс GraphicsDevice)
Все документы раздела: Для тех, кто хочет писать игры | Движок на OpenGL | Создание игр в Game Maker | Bump mapping | Использование Direct Input | XNA framework |


Дизайн Elite Games V5 beta.18
EGM Elite Games Manager v5.17 02.05.2010