Оптимизация игры AndEngine - PullRequest
11 голосов
/ 28 мая 2011

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

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

  1. Избегайте вызова GC (сборщик мусора) в основном действии в игре:
    a) не создавайте объекты во время игры;
    b) не создавайте ненужные объекты;
  2. Оптимизируйте кодэто повторяется очень часто

Я следовал этим шагам, но тем не менее у меня есть некоторые зависания во время игры.

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

Ответы [ 6 ]

16 голосов
/ 06 декабря 2011
  1. Уменьшить размеры текстур.
  2. Уменьшите переключатели текстур (иначе попытайтесь использовать таблицы спрайтов, чтобы текстуру нужно было менять как можно меньше)
  3. Использовать текстуры более низкого качества (RGBA4444 или RGB565 вместо RGBA8888) ..
  4. Вызовите setIgnoreUpdate, когда сущность не нуждается в обновлениях.
  5. Используйте SpriteBatches, если это возможно .

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

Кроме того, он выполнит конвейер запуска (onLoadEngine / onLoadResources / onLoadScene / onLoadComplete) в первом кадре GL-потока, а не в блокировании, в потоке пользовательского интерфейса (непосредственно в onCreate).

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

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

12 голосов
/ 20 июня 2011

Вы можете увеличить производительность, используя AndEngine: Используя Пул объектов http://c0deattack.wordpress.com/2011/01/06/andengine-using-the-object-pool/

7 голосов
/ 16 июня 2011

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

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

5 голосов
/ 10 сентября 2012

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

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

Для профилирования памяти вы можете использовать DDMS и трассировку, чтобы проверить распределение памяти и как часто в течение определенного периода времени вызывается GC. Этот ТАК вопрос имеет детали:

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

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

4 голосов
/ 28 мая 2011

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

0 голосов
/ 24 мая 2014

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

...