netlib.narod.ru< Назад | Оглавление | Далее >

Игра Rocket Commander

Мы уже столько говорили о постэкранных шейдерах, что оставшегося места едва хватит чтобы поговорить об игре Rocket Commander. Впрочем, это не имеет большого значения, поскольку игра Rocket Commander существует уже более года и есть множество относящихся к ней уроков, включая очень популярную серию видеоуроков на Codind4Fun (которые вы можете найти на www.msdn.com или в любом поисковом движке).

Не имеет смысла здесь снова повторять все то, что говорится в уроках. Игра Rocket Commander также написана с использованием DirectX для управляемого кода для .NET 1.1; сама игра работает в .NET 2.0. DirectX для управляемого кода заметно отличается от XNA — некоторые вещи легко переносятся, но визуализация шрифтов, поддержка спрайтов и некоторые другие вещи в коде DirectX полностью другие, а отдельные возможности, такие как анимированные модели, вообще не поддерживаются в XNA (или, по крайней мере, их не так легко импортировать).

Поэтому Rocket Commander XNA только показывает базовый движок, но продолжает оставаться доставляющей много удовольствия великолепной игрой, даже на Xbox 360 с игровым пультом Xbox 360, для которого игра никогда не предназначалась. Этот раздел говорит только о проблемах перехода от DirectX для управляемого кода к XNA. Если вы хотите больше узнать о Rocket Commander, посетите сайт www.RocketCommander.com и изучите видеоуроки. Почитайте исходный код и документацию и поиграйте в одну из многих, существующих ныне модификаций этой игры.

Производительность в XNA

Никто не верит в хорошую производительность XNA. Главная причина в том, что большинство существующих сегодня игр для XNA — это простые двухмерные игры, в которых не надо много беспокоиться о быстродействии, трехмерных аппаратных эффектах и шейдерах. Другая причина в том, что много людей думают, что на производительность плохо влияет обертывание DirectX в DirectX для управляемого кода или XNA, которое просто переадресует вызовы базовому каркасу DirectX. Важно учитывать то, сколько кода вы можете сэкономить и насколько проще писать игры в XNA, особенно, если вы хотите создать кроссплатформенную игру для Windows и Xbox 360. Вам потребуется проделать гораздо больше работы, чтобы получить все эти возможности, используя только С++. Вам, вероятно, потребуется в два раза больше программистов, чтобы создать игру так же быстро, как это сделает опытная команда, использующая XNA. Весьма вероятно, что вы столкнетесь с большим количеством проблем при управлении памятью, управлении указателями, и общей управляемостью в неуправляемом окружении.

В прошлом я доказал, что большинство программистов ошибочно предполагают, что DirectX для управляемого кода намного медленнее, чем собственно DirectX; это не имеет значения. Если ваш код на 100% использует GPU и на 100% центральный процессор, у вас, скорее всего, нет игры, а только оценочная программа для нагрузочного тестирования или экспериментов. Даже в таких ситуациях DirectX для управляемого кода достигает почти такой же производительности (98% – 99%), но для реальной игры это в любом случае не имеет значения, поскольку у вас не будет времени для оптимизации каждой отдельной строки вашего кода. Вместо этого вы сосредоточитесь на наиболее важных частях и попытаетесь, чтобы максимально быстро работали 10% – 20% кода, которые вызываются наиболее часто. Увеличение производительности остальных 80% – 90% кода займет в пять раз больше времени, и принесет увеличение частоты кадров лишь на пару процентов.

Вместо этого сосредоточьтесь на самой игре. Игроков не беспокоит 58 или 59 кадров формирует игра за секунду; они хотят, чтобы игра доставляла удовольствие, и, если вы позволяете изменять различные параметры, они могут даже уменьшить разрешение и отключить эффекты, чтобы получить большую частоту кадров. Большинство игр сегодня сосредотачиваются только на графике (подобно тому, как я поступаю в этой книге, но я, по крайней мере, также пытаюсь показать вам много хороших идей для игр, и надеюсь, что вы будете использовать базовый код и создавать свои собственные игры без того, чтобы длительное время заниматься написанием графического движка, игнорируя саму новую игру).

В любом случае, код Rocket Commander серьезно оптимизирован, и при разработке первой версии я проводил много тестов производительности. На кодирование всей игры ушло только четыре недели, и нелегко выжать максимум возможного из ваших шейдеров, если у вас так мало времени. Я получил около 100 кадров в секунду на PC средней конфигурации с видеокартой, поддерживающей шейдерную модель 2.0, на высоком разрешении, когда одновременно отображалось до 5000 астероидов (в ряде случаев каждую секунду визуализировалось более 30 миллионов полигонов) и каждый кадр включал проверку столкновений и некоторые другие эффекты. Игра может выполняться и на более слабых компьютерах, даже полностью без поддержки шейдеров. Выглядеть она будет не так красиво, но работать все будет замечательно.

Современные компьютеры еще быстрее и их центральные процессоры имеют несколько ядер, которые могут использоваться для одновременного выполнения нескольких задач. В Xbox 360 три ядра и ваш игровой код может выполняться в шесть потоков. Сегодня я не знаю игры, которой бы действительно требовалась эта невообразимая мощь центрального процессора Xbox 360; GPU также очень быстрый, но, особенно в высоких разрешениях, именно GPU не позволяет вам получать лучшие значения частоты кадров.

Игра Rocket Commander — это действительно хороший пример того, как распределять работу между двумя ядрами. Физические вычисления и предварительная проверка видимости секторов и астероидов занимают половину процессорного времени (иногда даже больше). Визуализация плюс дополнительные эффекты берут оставшуюся половину процессорного времени в каждом кадре. Физика может обсчитываться параллельно визуализации, поскольку все физические вычисления проверяют, пересекаются ли два астероида между собой, и, если да, отражают один от другого (рис. 8.20), обеспечивая, чтобы они больше не пересекались.


Рис. 8.20

Рис. 8.20


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

Здесь важно, что быстродействие Rocket Commander XNA даже лучше, чем у исходной версии. Можно играть в разрешении HDTV 1080p на Xbox (или PC) с использованием всех графических эффектов, полноэкранным сглаживанием, и показывать одновременно несколько тысяч астероидов, сохраняя очень высокую частоту кадров.

Переход от MDX к XNA

Исходный движок Rocket Commander имеет весьма схожие с XnaGraphicsEngine концепции. В некоторых областях у движка Rocket Commander больше возможностей, таких как анимированные модели и лучшая поддержка и визуализация множества астероидов. Например, все астероиды используют одни и те же шейдеры и материалы, что позволяет игре визуализировать их очень эффективным образом. Но некоторые другие возможности, такие как управление шрифтами и спрайтами в XNA, реализованы в XnaGraphicsEngine более легким и лучшим способом, чем в Rocket Commander. Вы можете извлечь преимущества из написанных вами новых классов шейдеров и даже подключить новые шейдеры, если хотите немного поэкспериментировать с визуальным оформлением Rocket Commander XNA.

Обратите внимание, что некоторые возможности, такие как поддержка анимированных моделей или проверка заграждения для эффекта светорассеяния в объективе из оригинальной Rocket Commander, вообще невозможны в XNA. Проверка заграждения просто отсутствует в XNA Framework. Полагаю, достаточно сложно заставить ее одинаково работать как на PC, так и на Xbox 360; это значительно ухудшает эффект светорассеяния в объективе, поскольку он не будет больше исчезать и пропорционально изменяться, когда астероид проходит перед диском солнца. Анимация моделей может быть реализована путем создания собственного обработчика моделей или даже введением нового формата для всех моделей, но хочется сделать перенос максимально простым, и уж конечно не хочется заново экспортировать каждую отдельную модель, а потом снова тестировать их все.

Код для работы с сетью полностью выкинут из версии для Xbox 360, поскольку на Xbox 360 отсутствует доступ к пространству имен System.Net. На платформе Windows игра по-прежнему отправляет таблицы рекордов на сервер в Интернете и получает их с него через веб-сервис. Все уровни и игровые данные на 100% совместимы и даже возможет перенос на XNA различных модификаций, но у меня есть чем заняться помимо этого. Можете свободно писать еще модификации Rocket Commander, особенно под XNA Framework. Я всегда счастлив получать письма от людей со всех концов света, которые использовали код, написали модификацию игры, и рассказывают мне истории успешного обучения по урокам и исходному коду.

В конце 2006 года я опубликовал длинную запись в своем дневнике на сайте, сравнивая MDX с XNA и обсуждая преимущества и недостатки использования XNA. Прочитайте ее, если вы раньше работали с MDX и все еще задаетесь вопросом, стоит ли тратить силы на XNA. В Rocket Commander XNA было добавлено несколько возможностей, в частности больше тестовых модулей и многопоточность, о которой я расскажу через пару секунд, но общее количество строк исходного кода уменьшилось более чем на 10%, что показывает, что даже в результате переноса проект стал проще. Эффект станет еще более очевидным, если все начать заново с чистого проекта XNA.

Использование потоков для увеличения производительности

Общая производительность Rocket Commander XNA великолепна, как на Windows, так и на Xbox 360, что особенно видно когда вы произведете некоторые тестовые замеры быстродействия. GPU подведен к пределу возможностей, и нет никаких причин бояться управляемого кода. Производительность Windows особенно великолепна; все мои программы и игры полностью используют GPU даже в низких разрешениях и даже когда в них есть только один поток.

На Xbox 360 производительность несколько хуже, и вы должны принять во внимание множество вещей, что может быть трудно из-за отсутствия документации. Например, худшая вещь, которую вы можете сделать на Xbox 360 — это генерация новых данных в каждом кадре, и даже если вы только создаете перечислитель, выполняя цикл foreach, это влияет на быстродействие. Хорошо, что у вас под рукой три ядра (и шесть аппаратных потоков), позволяющих вам оптимизировать производительность. В случае игры Rocket Commander это позволило значительно оптимизировать игровой цикл, поскольку потоки физики и обновления съедают почти 50% времени процессора. На PC это не имеет значения, поскольку все тормозит мой GPU (рис. 8.21), но на Xbox 360 благодаря использованию нескольких потоков мне удалось почти удвоить частоту кадров. Здорово.


Рис. 8.21

Рис. 8.21


Результат и снимки экрана

Rocket Commander XNA — великолепная игра и она работает даже лучше, чем оригинал, получив поддержку для Xbox 360 и XNA Framework на PC. Благодаря новым возможностям многопоточности и тому факту, что вы легко можете разделить физику и движок визуализации, быстродействие игры стало гораздо лучше, чем раньше, физика теперь более точная, а у движка визуализации появилось больше времени для визуализации большего количества астероидов или добавления других крутых эффектов.

Обе игры выглядят так похоже, что трудно сказать о различиях между оригинальной игрой и XNA-версией. Вы, вероятно, определите версию только по отсутствующим возможностям (таким, как анимированные модели и проверка заграждения для светорассеяния в объективе) или взглянув на новый игровой шрифт. Я добавил в главное меню логотип XNA, чтобы подчеркнуть различия между запуском оригинальной игры и XNA-версии (рис. 8.22).


Рис. 8.22

Рис. 8.22


Надеюсь, вы получите удовольствие от игры. Она свободно доступна, также как и оригинальная игра Rocket Commander, и вы можете использовать ее для реализации своих собственных игровых идей или просто для небольших экспериментов. Взгляните на рис. 8.23, где изображена игра Rocket Commander XNA в действии.


Рис. 8.23

Рис. 8.23



netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz