Опубликован: 28.04.2009 | Доступ: свободный | Студентов: 1838 / 107 | Оценка: 4.36 / 4.40 | Длительность: 16:40:00
Специальности: Программист
Лекция 1:

Введение в XNA Framework

Лекция 1: 123456789 || Лекция 2 >

Добавьте вызов этого метода в конец обработчика события Paint и снова запустите программу на выполнение - на экране появится окно, закрашенное синим цветом, что и требовалось. Исходный код готового приложения находится в каталоге Ch01\Ex01.

1.2. Визуализация шахматной доски

Одна из перегрузок метода GraphicsDevice.Clear позволяет очищать не весь экран целиком, а лишь заданную прямоугольную область формы:

public void Clear(ClearOptions options, Color color, 
float depth, int stencil, Rectangle[] rect);

где

rect - массив структур Microsoft.Xna.Framework.Rectangle, задающих прямоугольные области экрана, которые должны быть очищены. Области экрана задаются в оконных координатах формы - начало координат расположено в левом верхнем углу. Структура Microsoft.Xna.Framework.Rectangle является близнецом одноименной структуры из пространства имен System.Drawing, и используется во избежание привязки XNA Framework к платформе Windows.

Примечание

Структура Rectangle объявлена в пространстве имен Microsoft.Xna.Framework, так как он используется многими классами XNA Framework, в том числе и не из пространства имен Microsoft.Xna.Framework.Graphics.

К примеру, следующий фрагмент кода нарисует в центре экрана зелeный прямоугольник на синем фоне (рисунок 1.6):

// Закрашиваем экран синим цветом
device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);
// Создаeм массив с координатами областей экрана, которые необходимо закрасить. Нам
// нужна всего одна область
Microsoft.Xna.Framework.Rectangle[] rect = new Microsoft.Xna.
Framework.Rectangle[1];
// Задаeм координаты области экрана, расположенной в центре экрана и занимающей 25%
// площади экрана
rect[0] = new Microsoft.Xna.Framework.Rectangle(ClientSize.Width/4,
ClientSize.Height/4, ClientSize.Width/2, ClientSize.Height/2);
// Закрашиваем эту область зелeным цветом
device.Clear(ClearOptions.Target, Microsoft.Xna.Framework.
Graphics.Color.Green, 0.0f,
4> 0, rect);
Листинг 1.3.
Зелeный квадрат на синем фоне, нарисованный с использованием метода Clear

Рис. 1.6. Зелeный квадрат на синем фоне, нарисованный с использованием метода Clear

В принципе при грамотном использовании только одного метода Clear можно получать довольно интересные изображения. К примеру, никто не мешает нам нарисовать шахматную доску (рисунок 1.7). Для этого необходимо очистить экран белым цветом, затем создать массив областей экрана, соответствующих клеткам доски коричневого цвета и ещe раз очистить экран, но уже коричневым цветом (листинг 1.4).

Шахматная доска, нарисованная с использованием метода Clear

Рис. 1.7. Шахматная доска, нарисованная с использованием метода Clear
// Полный код приложения находится в каталоге Examples\Ch01\Ex02
private void MainFormPaint(object sender, PaintEventArgs e)
{
// Очищаем экран белым цветом
device.Clear(Microsoft.Xna.Framework.Graphics.Color. WhiteSmoke);
 // Создаeм массив областей закраски, соответствующих коричневым клеткам
Microsoft.Xna.Framework.Rectangle[] rects = 
new Microsoft.Xna.Framework.Rectangle[32] ;
int k = 0; 
// Перебираем коричневые клетки шахматной доски for 
(int j = 0; j < 8; j++)
for (int i = j % 2; i < 8; i += 2)
 {
// Заносим в массив координаты очередной клетки
rects[k] = new Microsoft.Xna.Framework.Rectangle(i * 
ClientSize.Width / 8, 
4 j * ClientSize.Height / 8, ClientSize.Width / 8, 
ClientSize.Height / 8);
k++;
}
// Закрашиваем все области из массива rects коричневым цветом
device.Clear(ClearOptions.Target, Microsoft.Xna.Framework.
Graphics.Color.Brown, 0.0f, 0, 
4> rects);
device.Present();
 }
Листинг 1.4.
1.2.1. Конфигурирование DirectX для отладки приложени

Как вы помните, на платформе Windows XNA Framework в некотором роде является высокоуровневой надстройкой над DirectX. Соответственно, на платформе Windows подавляющее большинство вызовов методов XNA Framework так или иначе транслируется в вызовы методов DirectX. В большинстве случаев это обстоятельство можно полностью игнорировать. Тем не менее, при возникновении различных "аномалий" в приложении обращение к нижележащему уровню может помочь быстро решить проблему.

Конфигурирование DirectX осуществляется при помощи утилиты DirectX, запускаемой командой Start | All Programs | Microsoft DirectX SDK | DirectX Utilities | DirectX Control Panel. Внешний вид этой утилиты изображeн на рисунке 1.8. Как видно, данная утилита представляет собой обычное диалоговое окно с набором вкладок, отвечающих за настройку различных компонентов DirectX. Рассмотрим наиболее важные из них.

Внешний вид утилиты конфигурирования DirectX. Открыта вкладка Direct3D

Рис. 1.8. Внешний вид утилиты конфигурирования DirectX. Открыта вкладка Direct3D

Вкладка Direct3D предназначена для настройки компонента Direct3D Graphics. Как правило, эта вкладка используется для переключения между отладочной и "обычной" версией Direct3D при помощи переключателей Use Debug Version of Direct3D и Use Retail Version of Direct3D соответственно (расположены в группе Debug/Retail D3D Runtime ). Отладочная версия Direct3D Graphics проводит дополнительную проверку правильности параметров передаваемых классам Direct3D Graphics и правильности выполнения этих методов. Информация о различных подозрительных ситуациях и ошибках передаeтся в отладчик (например, в отладчик Visual Studio 2005 ).

При разработке и отладке приложений рекомендуется всегда использовать отладочную версию Direct3D Graphics. Так же полезно установить ползунок Debug Output Level, отвечающий за подробность отладочной информации в крайнее правое положение, чтобы получать информацию о любых подозрительных ситуациях. Ведь согласно "эффекту бабочки", даже самый безобидный на первый взгляд недочeт может привести к каскаду трудноуловимых ошибок.

В группе Debugging желательно включить следующие флажки: Maximum Validation (максимальная проверка корректности параметров, передаваемых классам Direct3D Graphics ), Enable Shader Debugging (отладка шейдеров) и Break on Memory Leaks (обнаружение утечек памяти).

Внимание

Отладочная ( Debug ) версия DirectX Graphics значительно медленнее обычной ( Retail ) версии. Поэтому не забывайте отключать отладочную версию DirectX по завершению отладки. В противном случае вы рискуете столкнуться с аномально низкой производительностью трeхмерных игр и аналогичных приложений. Для того чтобы переключиться в нормальный режим, достаточно просто включить радиокнопку Use Retail Version of DirectX – остальные опции вроде Debug Output Level не оказывают никакого влияния на обычную версию Direct3D Graphics.

Debug View

По умолчанию Visual Studio 2005 Pro не отображает сообщения от отладочной версии DirectX, а в бесплатной версии Visual C# 2005 Express подобная функциональность не предусмотрена в принципе. Поэтому я включил в example.zip бесплатную программу Марка Руссиновича Debug View, расположенную в каталоге \Tools\DebugView. Скопируйте еe на локальный жесткий диск компьютера и запустите файл DebugView.exe. На экране появится окно следующего вида (рисунок 1.9). Наибольший интерес для нас представляет центральная часть окна, в которой отображают отладочные сообщения от всех приложений, выполняющихся в данный момент на компьютере. Если вы поработаете некоторое время на компьютере при запущенной утилите Debug View, то наверняка заметите множество отладочных сообщений от разнообразных приложений.

 Приложение Debug View

увеличить изображение
Рис. 1.9. Приложение Debug View

Откройте панель управления DirectX, и включите отладочную версию DirectX. Запустите на выполнение приложение, рисующую шахматную доску (пример Ch01\Ex02 ), поработайте с ним некоторое время, после чего завершите. Тем временем в окне Debug Info появится информация следующего вида:

// Библиотека Direct3D загружается в адресное пространство 
нашего приложения Direct3D9: :====> ENTER: DLLMAIN(041dd6e0): 
Process Attach: 0000041c, tid=000016a8 Direct3D9: :====> EXIT: 
DLLMAIN(041dd6e0): Process Attach: 0000041c
// Direct3D находится в отладочном режиме
Direct3D9: (INFO) :Direct3D9 Debug Runtime selected.
// Расширенные возможности отладки Direct3D недоступны 
(эта функциональность доступна
// только для DirectX-приложений, написанных на C++)

D3D9 Helper: Enhanced D3DDebugging disabled; Application was 
not compiled with D3D_DEBUG_INFO
// Сообщение с пометкой INFO содержат разнообразную служебную 
информацию о ходе
// выполнения приложения. В частности следующее сообщение означает, 
что устройство
// находится в режиме Software Vertex Processing (Программная обработка
 вершин). Иными
// словами, при создании графического устройства был использован флаг
// CreateOptions.SoftwareVertexProcessing.
Direct3D9: (INFO) :======================= Hal SWVP device selected
Direct3D9: (INFO) :HalDevice Driver Style 9
Direct3D9: :DoneExclusiveMode
Direct3D9: :====> ENTER: DLLMAIN(041dd6e0): Process Detach 0000041c,
 tid=0000022c
// Освобождение ресурсов Direct3D завершено Direct3D9: (INFO) :MemFini!
// Завершение работы Direct3D
Direct3D9: :====> EXIT: DLLMAIN(041dd6e0): Process Detach 0000041c

Обратите внимание

В столбце Time указано время поступления отладочного сообщения, что облегчает идентификацию сообщений. По умолчанию используется относительное время – за точку отсчeта берется время поступления первого события, т.е. время наступление первого события всегда равно 0.0 секунд.

Как видно, приложение выполняется без каких-либо эксцессов. Теперь закомментируйте строку device.Dispose() в обработчике события Close() и снова запустите приложение на выполнение. На этот раз отладочные сообщения будут несколько отличаться:

Лекция 1: 123456789 || Лекция 2 >
Андрей Леонов
Андрей Леонов

Reference = add reference, в висуал студия 2010 не могу найти в вкладке Solution Explorer, Microsoft.Xna.Framework. Его нету.