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

Введение в XNA Framework

Лекция 1: 123456789 || Лекция 2 >
1.2.4. Восстановление работоспособности программы после потери устройства

Операционная система Windows является многозадачной операционной системой, поэтому параллельно с вашим XNA -приложением могут выполняться десятки других приложений использующих графическую подсистему компьютера. При этом не исключены конфликтные ситуации. Например, какая-нибудь программа может неожиданно изменить разрешение экрана, что вызовет перераспределение видеопамяти, что в свою очередь приведeт к частичной потере информации, хранящейся в видеопамяти. В результате с большой долей вероятности класс GraphicsDevice вашего приложения потеряет информацию в видеопамяти и не сможет продолжать работу. В XNA Framework и DirectX это явление называется потерей устройства ( Device Lost ).

Для начала нам надо научиться воспроизводить потерю устройства, иначе мы не сможем проверить, как наша программа поведeт себя в случае потери устройства. Я обнаружил, что потеря устройства всегда14Я не встречал ни одной видеокарты, на которой в этом случае не происходила бы потеря устройства происходит при переключении консольного приложения в полноэкранный режим при помощи клавиш alt + Enter. Следовательно, для форсирования потери устройства вам необходимо:

  1. Запустить приложение, использующее DirectX.
  2. Запустить консольное приложение. Я предпочитаю пользовать FAR, но если у вас он не установлен, вполне подойдeт и обычная командная строка ( Start | All Programs | Accessories | Command Prompt )
  3. Переключиться в полноэкранный режим и обратно в оконный (два раза нажать Alt + Enter ).

Если вы проделаете эти операции над примером Ex03 из предыдущего раздел, то он аварийно завершится из-за не перехваченного исключением Microsoft. Xna.Framework.Graphics.DeviceLostException, название которого ясно говорит о причине краха приложения.

Для определения текущего состояния устройства в классе GraphicsDevice имеется свойство GraphicsDeviceStatus:

public GraphicsDeviceStatus GraphicsDeviceStatus { get; }

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

  • Normal - устройство функционирует нормально
  • NotReset - устройство потеряно, но может быть восстановлено методом Reset класса GraphicsDevice.
  • Lost - устройство потеряно и пока не может быть восстановлено.

Если устройство находится в состоянии NotReset, то его необходимо восстановить, вызвав метод GraphicsDevice.Reset, после чего приложение может продолжать работу, как ни в чeм не бывало. Если же устройство находится в состояние Lost, то тут нечего не поделать - остаeтся лишь выйти из обработчика события Paint и ждать лучших времeн.

Потеря устройства является очень коварной проблемой, которая может произойти не только до вызова обработчика Paint, но и внутри него. В этом случае XNA Framework в зависимости от ситуации сгенерирует исключения Direct3D.DeviceNotResetException или Direct3D.DeviceLostException. Если сгенерировано исключение Direct3D.DeviceNotResetException, то приложение должно восстановить устройство методом GraphicsDevice.Reset() и снова перерисовать изображение путeм вызова метода Form.Invalidate(), в противном случае просто выйти из обработчика события Paint.

После всего вышесказанного мы сможем легко научить нашу программу корректно реагировать на потерю устройства. Исходный код обновлeнного обработчика события Paint приведeн в листинге 1.8.

// Полный текст приложения находится в каталоге Examples\Ch01\Ex05
private void MainForm_Paint(object sender, PaintEventArgs e)
{
try
{ 
// Если устройство нельзя восстановить, генерируем исключение 
DeviceLostException (мы его 
// перехватим в блоке catch)
Я не встречал ни одной видеокарты, на которой в этом случае не 
Я происходила бы потеря устройства.
if (device.GraphicsDeviceStatus == GraphicsDeviceStatus.Lost)
 throw new DeviceLostException();
// Если устройство можно восстановить, восстанавливаем его
if (device.GraphicsDeviceStatus == GraphicsDeviceStatus.NotReset) 
device.Reset();
// Рисуем шахматную доску
device.Clear(XnaGraphics.Color.WhiteSmoke) ;
Xna.Rectangle[] rects = new Xna.Rectangle[32];
int k = 0;
for (int j = 0; j < 8; j++)
for (int i = j % 2; i < 8; i += 2) {
rects[k] = new Xna.Rectangle(i * ClientSize.Width / 8, Ь  j * 
ClientSize.Height / 8, ClientSize.Width / 8, ClientSize.Height / 8); 
k++; 
}
device.Clear(ClearOptions.Target, XnaGraphics.Color.Brown, 0.0f, 0,
 rects);
device.Present();
} 
// Если произошло исключение DeviceNotResetException, перерисовываем 
экран. Восстанавливать 
// устройство не имеет смысла - наш обработчик события Paint сделает
 это автоматически
catch (DeviceNotResetException)
{
Invalidate();
} 
// Если произошло исключение DeviceLostException, то нам остается 
только ждать до лучших 
// времен
catch (DeviceLostException)
{
} 
}
Листинг 1.8.

Практическое упражнение №1.2

"Обучите" программу, которую вы создали в упражнении №1.1, корректно реагировать на потерю устройства.

Заключение

XNA Framework - это высокопроизводительная мультимедийная библиотека для разработки приложений, требовательных к производительности видеоподсистемы и аудиосистемы компьютера, а так же подсистеме ввода-вывода. Одной из причин появления XNA Framework являются некоторые трудности использования Microsoft DirectX на платформе .NET. В отличие от компонентов "обычного" DirectX, сборки Microsoft.Xna.Framework.dll и Microsoft.Xna.Framework.Game.dll соответствуют всем требованиям платформы .NET 2.0 и не привязаны к конкретному языку программирования. В результате эта сборка с одинаковой лeгкостью могут использоваться в любой .NET -совместимой среде программирования вроде Microsoft Visual Basic, Microsoft Visual C# , Microsoft Visual J# или Iron Python. Кроме того, XNA Framework является платформо-независимый библиотекой, что открывает дорогу для переноса приложений на другие платформы, такие как, XBOX 360. Все компоненты XNA Framework условно можно разделить на четыре уровня абстракции: Platform, Core Framework, Extended Framework и Game. В этой лекции мы познакомились с компонентом Graphics (один из компонентов уровня Core Framework ), предназначенным для работы с графической подсистемой компьютера на относительно низком уровне. Плюсом подобного низкоуровневого подхода является высокая производительность приложения, минусом - необходимость учeта разнообразных нюансов вроде коррекции размера вспомогательного буфера при изменении размера окна или и возможности неожиданной потери устройства. Впрочем, даже поверхностные знания основных процессов, творящихся под капотом высокоуровневых графических библиотек, очень полезны при написании надежных высокопроизводительных графических приложений.

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

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