Reference = add reference, в висуал студия 2010 не могу найти в вкладке Solution Explorer, Microsoft.Xna.Framework. Его нету. |
Введение в XNA Framework
1.2.4. Восстановление работоспособности программы после потери устройства
Операционная система Windows является многозадачной операционной системой, поэтому параллельно с вашим XNA -приложением могут выполняться десятки других приложений использующих графическую подсистему компьютера. При этом не исключены конфликтные ситуации. Например, какая-нибудь программа может неожиданно изменить разрешение экрана, что вызовет перераспределение видеопамяти, что в свою очередь приведeт к частичной потере информации, хранящейся в видеопамяти. В результате с большой долей вероятности класс GraphicsDevice вашего приложения потеряет информацию в видеопамяти и не сможет продолжать работу. В XNA Framework и DirectX это явление называется потерей устройства ( Device Lost ).
Для начала нам надо научиться воспроизводить потерю устройства, иначе мы не сможем проверить, как наша программа поведeт себя в случае потери устройства. Я обнаружил, что потеря устройства всегда14Я не встречал ни одной видеокарты, на которой в этом случае не происходила бы потеря устройства происходит при переключении консольного приложения в полноэкранный режим при помощи клавиш alt + Enter. Следовательно, для форсирования потери устройства вам необходимо:
- Запустить приложение, использующее DirectX.
- Запустить консольное приложение. Я предпочитаю пользовать FAR, но если у вас он не установлен, вполне подойдeт и обычная командная строка ( Start | All Programs | Accessories | Command Prompt )
- Переключиться в полноэкранный режим и обратно в оконный (два раза нажать 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та разнообразных нюансов вроде коррекции размера вспомогательного буфера при изменении размера окна или и возможности неожиданной потери устройства. Впрочем, даже поверхностные знания основных процессов, творящихся под капотом высокоуровневых графических библиотек, очень полезны при написании надежных высокопроизводительных графических приложений.