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

Я пишу игру с использованием С# 2010 и XNA 4.0. Я хочу, чтобы это была хорошая игра, а не какая-то "просто еще одна хрень", и поэтому одна из моих целей - хорошая частота кадров. Для этого я хотел бы попросить вас о некоторых советах, будь то связанный с XNA или связанный с С# - что я могу сделать, чтобы ускорить мой код и улучшить FPS.

Вот что я узнал:

  • (С#) с помощью array insted из list<> значительно улучшит производительность, если вы захотите получить доступ к огромному количеству данных (или даже к лотам: имея массив из 20000 элементов, дал почти 180% FPS списка 20000.
  • (С#), используя for вместо foreach, улучшит производительность. На тех же 20000 элементах это похоже на разницу в 5-10%.
  • (xna и С#) вызывает затраты на производительность, поэтому, когда я разбросал свой код на методы, называемые другими методами и т.д., и все было настолько круто и объектно ориентировано, что оно стоило 1-3 FPS за каждый вызов.
  • (xna) update vs. draw: не было никакой разницы в производительности, когда я добавлял код в update() и draw(), поэтому, если вам не все равно, вам не нужно вводить некоторые методы под обновление() вместо того, чтобы держать все вместе в draw() в надежде на лучшее FPS.
  • (xna) нет идеи, если это я или просто 4.0, но когда вы загружаете .X с множеством текстур в нем и довольно сложными сетками, для загрузки требуется много времени. Мне пришлось написать свой собственный .X-загрузчик и рендеринг сетки/модели только потому, что XNA начала загружать текстуру для каждого треугольника, независимо от того, имела ли предыдущая текстура. Даже написать мой собственный контент-загрузчик, который кэширует текстуры для вас, не является решением, потому что он все еще используется много раз. Если вы делаете что-то приятное и пушистое, я предлагаю использовать класс drawuserprimitives, а не Model. (не знаю, только ли это 4.0), либо у 3.1 была такая проблема с производительностью)
  • (xna и С#) Старайтесь избегать использования "нового", когда речь идет о рисовании. Я видел некоторый код в Интернете, что было скопировано/вставлено вместе и было "basicEffect = новый BasicEffect (graphicsDevice)"; и такая уродство в розыгрыше(), и еще хуже: в итерациях внутри draw(). Это убьет производительность. Вместо этого есть один такой класс в "игре" или в статическом классе. Это относится и к другим "темп-объектам": уродливым, но я думаю, что лучше создать что-то глобальное и использовать его с вниманием, чтобы сделать хороший и пушистый код, что сделает нашу игру из-за сборщика мусора.

Хорошо, поэтому, чтобы сделать длинный рассказ коротким, пожалуйста, напишите здесь хороший совет, чтобы мы могли делать хорошие, быстрые и оптимизированные игры;)

Спасибо заранее: Zéiksz

Ответы

Ответ 1

В UberGeekGames есть хорошая статья об оптимизации XNA. В основном это предназначено для Xbox и WP7, но многие из них также применимы к ПК.

http://www.sgtconker.com/2011/05/high-end-performance-optimizations-on-the-xbox-360-and-windows-phone-7/

Оригинальный сайт мертв, но доступен в интернет-архиве:

Архивированная версия оптимизаций высокой производительности на Xbox 360 и Windows Phone7

Эмпирическое правило - это "профиль перед оптимизацией".

Ответ 2

Оптимизация программного обеспечения - это ремесло. Лучшие виды оптимизации - это данные, основанные на собранной статистике.

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

Затем опубликуйте некоторые конкретные вопросы, и я уверен, что вы получите некоторую помощь здесь по конкретным вопросам.

В то же время я предлагаю вам получить дополнительную информацию из книг по разработке игр, таких как перечисленные здесь: http://forums.create.msdn.com/forums/p/8642/45646.aspx.

XNA Extereme 101 - кажется интересным учебником

Ответ 3

Стоимость моего 2 центов:

Не помещайте весь свой код в один метод, потому что считаете нужным вызвать метод. Если вы ДУМАЕТЕ потерять 1-3 FPS, вызвав пустой метод, вы, вероятно, еще не закончили исследование потери 1-3. Чтобы эта потеря была истинна во время пустого вызова метода, вам нужно иметь FrameRate в МНОГИХ тысячах.... где вы не будете беспокоиться о 1-3 падениях.

FPS - плохой способ оценить производительность в XNA. Когда вы включаете переменный временной шаг, другие процессы, с которыми связана ОС, могут влиять на вашу частоту кадров. Вам действительно нужно профиль. Просто сосредоточьтесь на количестве времени, которое оно действительно принимает для завершения методов Update &/или Draw, путем их синхронизации с объектом System.Diagnostic.Stopwatch. время их индивидуально, а не вместе (очень важно).

Ключевое слово 'new' следует избегать не только в вызове рисования, но и в любом месте как для обновления, так и для рисования... Только для ссылочных типов. Используйте новое ключевое слово в любое время и в любом месте, где вам нужно, со значениями типов.