Я пишу игру с использованием С# 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