Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

Виртуализация графического устройства в XNA 2.0/3.0
Перевод записи блога Shawn Hargreaves Blog (один из разработчиков XNA framework) об изменениях в графическом устройстве (GraphicsDevice).

Во второй версии XNA мы полностью виртуализировали графический девайс.

Если кратко, то это означает что вам больше никогда не потребуется заботиться о многих вещах, думать о которых приходилось раньше.

Теперь по-порядку...

Как оно было раньше (XNA 1.0)

Когда ваша игра стартует, происходит вызов метода LoadGraphicsContent(true) который отвечает за загрузку контента и создание ваших ресурсов. (textures, vertex buffers, rendertargets, и т.д.)

Если во время игры происходит переход между оконным и полноэкранным режимами, а так же если было нажатие alt+tab и еще в ряде некоторых случаев - графическое устройство получает статус lost (потерянного) и нуждается в пересоздании. Использовать потерянный девайс разумеется нельзя и по этому, все вызовы к нему приостанавливаются и далее происходит создание нового устройства, по завершении которого некоторые типы ресурсов так же будут нуждаться в пересоздании.

  • Большинство текстур, вершинных и индексных буферов, и т.д. остаются валидными.
  • Все текстуры, буферы и др. ресурсы, созданные с использованием ResourceManagementMode.Manual - будут уничтожены
  • Все рендер таргеты так же будут уничтожены.

Когда такое происходит, XNA вызывает метод LoadGraphicsContent(false), который должен пересоздать все ресурсы загружаемые в режиме ResourceManagementMode.Manual.

Многих такой подход вводил в заблуждение, так как не всегда можно было четко определить какой ресурс восстановит XNA, а какой нужно восстанавливать самому. Кроме этого, необходимо было заменить все ссылки на старые ресурсы - новыми, и если ваша игра использовала одни и те же ресурсы в разных местах, то процесс такой замены становился совсем не тривиальной задачей...

Гораздо более сложная проблема возникает когда пользователь перетаскивает окно игры с одного экрана на другой (когда два монитора в системе). В таких случаях уничтожаются вообще все ресурсы, даже те, которые были созданы в режиме ResourceManagementMode.Automatic. Кроме этого, сам графический девайс то же должен быть полностью пересоздан (создается новый экземпляр объекта GraphicsDevice) и все ваши ссылки на старый девайс становятся инвалидными. Получить ссылку на новый экземпляр девайса можно было с помощью интерфейса IGraphicsDeviceService или используя класс GraphicsDeviceManager. Тут смысл в том, что правильнее будет использовать не прямые ссылки на девайс а получать референс на него используя тот же менеджер, например.

Как оно работает теперь (XNA 2.0)

Во второй версии XNA, и сам графический девайс и все его ресурсы постоянно остаются валидными. Тут нет необходимости заботиться о восстановлении ссылок на мертвые ресурсы, плюс к этому, на объект класса GraphicsDevice можно ссылаться где угодно и сколько угодно. Метод LoadContent, который раньше был LoadGraphicsContent, теперь вызывается только один раз - в момент старта игры.

Разумеется все проблемы с ресурсами из первой версии XNA не исчезли сами по себе и во второй версии. Внутренняя логика работы с ресурсами была полностью переделана, теперь, если происходит сброс (потеря) устройства, XNA сама создаст новый ресурс и скопирует в него все данные из старого. После чего, у владельца этого ресурса будет заменена ссылка на него. (Все классы ресурсов в XNA являются обычными обертками и просто хранят ссылку на unsafe объект, именно эта ссылка и будет заменена)

Однако, тут есть один момент. Некоторые типы ресурсов просто технически невозможно восстановить автоматом. Это относиться к ресурсам, которые постоянно обновляются из клиентского кода или с помощью GPU.

  1. DynamicVertexBuffer
  2. DynamicIndexBuffer
  3. RenderTarget*
  4. ResolveTexture2D
Трудность автоматической реконструкции таких ресурсов в том, что они так же как и остальные ресурсы, создаются в памяти самой видеокарты, чтение из которой или очень затруднено по причинам производительности или вообще невозможно. И если со статическими данными все понятно (они создаются один раз и больше не меняются), то с динамическими, нельзя быть уверенным о свежести самих этих данных в момент сброса, так как логика их обновления определяется клиентским кодом.

Звучит это может и страшно, но пугаться все же не стоит. Единственное о чем придется заботиться, это о повторном наполнении контентом таких ресурсов, сами экземпляры классов останутся валидными. Вы проверяете состояние "потерянности" ресурса используя новое свойство IsContentLost, и дальше принимаете решение запускать ваши алгоритмы реинкарнации или нет. Оживлять вам придется только сам динамический контент ресурса, все остальное (его размеры, формат и др.) останутся прежними.

Приведем пример:

Если ваша игра использует рендер таргеты для отрисовки теней или может для пост эффектов, то об новом заполнении данными таких таргетов, в момент сброса устройства, не стоит заботиться вообще, так как их наполнение происходит и так каждый кадр.

В случае если обновление происходит реже одного раза за кадр, то новое свойство IsContentLost вам в помощь ...

Как оно работает на  Xbox

На Xbox нет мультизадачной операционной системы и большинство ситуаций потери устройства просто не имеют место быть. Тут только одна задача может выполняться в один момент времени (не путать с потоками ею порожденными), соответственно ваша игра будет полноправным владельцем графического устройства и о его сбросах, вызванных внешними причинами, можно просто забыть.

Метод LoadGraphicsContent (или LoadContent во второй версии XNA ) вызывается только один раз, в момент старта. Так что при создании Xbox-овой версии XNA  нам не пришлось заниматься проблемой виртуализации графического устройства...
Комментарии
Нет комментариев.
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,03 секунд 8,709,630 уникальных посетителей