Игра Оптимизация AndEngine

Я использую java + AndEngine в своей игре.

Во время игры у меня есть некоторые зависания, я искал информацию и нашел несколько шагов, как оптимизировать производительность игры:

  • Избегайте использования GC (сборщика мусора) вызывается в основном действии в игре:
    а) не создавать объекты во время игр;
    б) не создавать ненужные объекты;
  • Оптимизировать код, который повторяется очень часто

Я выполнил следующие шаги, но тем не менее у меня есть зависания во время игрового процесса.

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

Ответ 1

  • Уменьшить размеры текстур.
  • Уменьшить текстурные переключатели (попробуйте использовать спрайты, чтобы текстура должна была быть изменена как можно меньше).
  • Используйте текстуры более низкого качества (RGBA4444 или RGB565 вместо RGBA8888).
  • Вызов setIgnoreUpdate, где сущность не нуждается в обновлениях.
  • Используйте SpriteBatches, если это возможно.

FYI: Следующая версия AndEngine (в середине декабря) оснащена GLES2, поэтому у вас есть больше возможностей для улучшения производительности с помощью пользовательских шейдеров и сущностей.

Также он будет запускать конвейер запуска (onLoadEngine/onLoadResources/onLoadScene/onLoadComplete) в первом кадре GL-Thread вместо блокировки на UI-Thread (непосредственно в onCreate).

Также он позволяет легко разгрузить этапы конвейера в потоки, не разбивая трубопровод в целом. Будет очень просто реализовать подкласс BaseGameActivity, который показывает определенный ProgressDialog, пока выполняются этапы конвейера. Объекты будут появляться по мере их присоединения к сцене.

В целом это означает, что фактические нагрузки уменьшаются, и, что более важно, времена загрузки войлока значительно уменьшаются! Создание загрузочного экрана тривиально легко, в отличие от боли, которая была до этого.

Ответ 3

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

Например, в моей игре используются враги, которые "случайно" летают в верхней части экрана. Сначала я делал нового врага с каждым вызовом, но теперь у меня есть ArrayList, в котором содержится всего 6 врагов, которые получают повторное использование и перемещаются по сотни раз каждый. Это привело к огромному увеличению производительности для меня, особенно в более длинных игровых сессиях. Это связано с оптимизацией GC, но с тем, что у вас может не быть, хотя об оптимизации ранее.

Ответ 4

Невозможно переоценить важность профилирования вашего кода перед выполнением превентивных оптимизаций. Нет смысла оптимизировать все спрайты и т.д., Если вы связаны с GPU (это маловероятно, но поскольку вы используете GLES2.0 и программируемый конвейер, и поскольку мы не знаем, как вы написали код GLSL, возможно).

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

Для профилирования памяти вы можете использовать DDMS и traceview для проверки распределения памяти и того, как часто в течение определенного периода времени вызывается GC. В этом вопросе SO есть детали:

Как профилировать приложение для Android?

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

Ответ 5

Подход, который я использую, заключается в загрузке всех необходимых текстур до начала уровня. Когда вы переходите на следующий уровень, вы должны выгружать только текстуры объектов, которые не нужны на следующем уровне. Другие, такие как табло или основной фон, не должны загружаться. И, конечно же, вам нужно выгрузить все свои текстуры в свою активность на Stop. Правда, во-первых, вы должны оптимизировать код цикла, например, вы не должны получать доступ к каким-либо ресурсам во время цикла, попробуйте извлечь их все, прежде чем вы начнете цикл.

Ответ 6

Это определенно улучшит вашу производительность игры: постоянно сохраняйте тему по умолчанию. Вот учебник http://www.andengine.org/forums/tutorials/andengine-performance-tip-of-the-day-t810.html