Плохая производительность на 360 и WP7 - PullRequest
2 голосов
/ 04 февраля 2012

Я только что запустил свою 2D-игру со спрайтами на 360 и WP7, и она намного медленнее, чем аналог Windows.FPS составляет около кадра в секунду, но на окнах он плавный.Я использую Farseer последнюю версию в этом.Есть ли что-то на этих двух платформах, что может вызвать такое резкое замедление?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 05 февраля 2012

Да.На этих двух платформах есть ОПРЕДЕЛЕННЫЕ вещи, которые могут вызвать значительное замедление.У CLR на 360 и WP7 гораздо более медленные сборщики мусора, чем на ПК.В результате производительность на этих двух платформах может сильно различаться.Игра на ПК со скоростью 60 кадров в секунду может замедлить до 1-2 кадров в секунду на этих платформах.

Существует множество ресурсов для устранения неполадок и оптимизации кода для получения того же FPS.на всех трех платформах.Вот те, которые я бы порекомендовал.

Во-первых, ознакомьтесь со статьей Шона Харгрива о " Как определить, что ваша сборка мусора идет слишком медленно ". Сначала ответит, действительно ли это то, что вы делаете.Наблюдение.

Затем прочитайте статью Яна Николадса " High End Performance Optimizations для Xbox360 и WP7 ". В этой статье много полезных советов, советов и хитростей.Большинство из них должно помочь устранить любые текущие проблемы с производительностью, которые у вас есть.

Здесь также есть несколько хороших постов о переполнении стека, которые я бы порекомендовал вам просмотреть: Дрожание игры на xBox360 Производительность игр XNA

Также для хорошего чтения команда .NET Compact Framework (и WP7, и 360 используют модифицированную версию компактной платформы) имеют несколько старых, но полезных статей о производительности управляемого кодана Xbox 360 Part1 & Part2

Там также есть несколько замечательных статей от ребят из окопов.Люди, которые ранее выпускали игры на 360 и WP7.Вот одна из моих любимых работ Криса Стила, который выпустил игры на нескольких платформах с XNA под названием « Требуется оптимизация кода для игр Xbox XNA ».

И последнее, но не менее важное:ДЕСЯТЬ сообщений на форумах App Hub, охватывающих все области производительности от WP7 до Xbox производительности.К сожалению, поиск в App Hub не слишком велик, но посты там есть и предлагают всевозможные советы и рекомендации по поиску и улучшению производительности ваших игр на этих платформах.

2 голосов
/ 08 февраля 2012

Я полностью согласен, Джордж Клингерман, CLR на 360 и WP7 гораздо медленнее сборщиков мусора, чем на ПК.

Прежде всего, я рекомендую вам узнать, как работает сборщик мусора (это не так сложно).

Основные шаги: 1. Проверка 2. Профиль 3. Поиск местоположения 4. Исправление

Здесь вы можете найти пошаговые инструкции (основные) о том, как это сделать с помощью CLRProfiler http://spacedjase.com/post/2010/07/02/How-to-eliminate-frame-by-frame-Garbage-Generation-using-CLR-Profiler.aspx

CLR Profiler позволяет вам просматривать управляемую кучу процесса и исследовать поведение сборщика мусора.Используя различные представления в инструменте, вы можете получить полезную информацию о выполнении, распределении и потреблении памяти вашего приложения.(Загрузить http://www.microsoft.com/download/en/details.aspx?id=16273)

Вот самые полезные ссылки, которые я нашел в Интернете:

  • Как определить, слишком ли медленно выполняется сборка мусора на Xbox (http://blogs.msdn.com/b/shawnhar/archive/2007/06/29/how-to-tell-if-your-xbox-garbage-collection-is-too-slow.aspx)
  • Двойные пути к нирване сборщика мусора (2 различных подхода для борьбы с медленным сборщиком мусора) http://blogs.msdn.com/b/shawnhar/archive/2007/07/02/twin-paths-to-garbage-collector-nirvana.aspx

И вот краткое изложение того, что я считаю наиболее существенными проблемами:

Не используйтеlinq Не используйте LINQ. Он выглядит круто. Он делает ваш код короче, проще и, возможно, даже легче для чтения. Но запросы LINQ могут легко стать большим источником мусора. Они хорошо подходят для вашего кода запуска, так как вы собираетесьгенерировать мусор в любом случае, просто загружая ресурсы и подготавливая игровые ресурсы, но не используйте его в Update, Draw или любом другом методе, который вызывается во время игры.

Отображение строки без запуска сборки мусора Ответить ЦитатаМинимизируйте использование ToString (). Как минимум он создает строку, которая живет в куче. См. Выше о том, как нарисовать int на экране без генаОцените любой мусор.Если вам нужно использовать ToString, попробуйте ограничить частоту его вызова.Если строка изменяет только каждый уровень, генерируйте ее только один раз в начале уровня.Если оно изменяется только при изменении определенного значения, генерируйте его только при изменении этого значения.Любые ограничения, которые вы можете поставить, стоят того.Время, необходимое для проверки логического условия, настолько мало, что его практически не существует.Вероятно, вы могли бы уместить десятки и даже сотни тысяч проверок истинности / ложности за количество времени, которое требуется ГХ для работы в сложной куче.http://forums.create.msdn.com/forums/p/45512/273330.aspx#273330 http://spacedjase.com/post/2010/09/16/Garbage-safe-number-to-string-conversion.aspx Остерегайтесь форматирования строки.Трудно манипулировать строками в .NET без выделения ресурсов.

Не выделять память (дух!) Это просто: не вызывать new для ссылочных типов.Однако это нормально для новых типов значений, таких как Matrix, Vector3 и Color.Каждый раз, когда вы захотите создать новый ссылочный тип, используйте пул объектов для повторного использования существующих экземпляров.Образцы Particle and Audio 3D oncreators.xna.com используют эту технику, и SwampThingTom опубликовал блог о многоразовой коллекции пулов.http://swampthingtom.blogspot.com/2007/06/generic-pool-collection-class.html http://spacedjase.com/post/2010/07/02/Generic-Resource-Pool.aspx

Не используйте классы, которые выделяются от вашего имени. Когда вы добавляете данные в класс коллекции, такой как List или Dictionary, может потребоваться выделить память для расширения коллекции.Вы можете избежать этого, используя перегрузки конструктора коллекции, которые имеют явные параметры емкости.Укажите емкость для предварительного выделения столько памяти, сколько вам когда-либо понадобится для максимального количества объектов, которые вы намерены хранить в коллекции.

Не заставлять среду выполнения CLR выделять Среда выполнения CLR выделяет память, когда происходит упаковка.Избегайте этого, как чумы!Упаковка может происходить по многим причинам, некоторые очевидные, другие менее. • Если вы назначаете тип значения переменной объекта, она упаковывается.• Если вы храните типы значений в одном из старых неуниверсальных классов коллекции, они будут упакованы.• Доступ к типам значений через интерфейс приводит к их упаковке.• Если вы используете тип enum в качестве словарного ключа, внутренние словарные операции вызовут бокс.Вы можете избежать этого, используя целочисленные ключи и приводя значения enum к целым числам, прежде чем добавлять их в словарь

Привет из Аргентины HERNAN

...