Профилирование

Данная статья описывает небольшие вспомогательные инструменты и утилиты libGDX, которые могу пригодиться в случае, если вы сталкиваетесь с проблемами производительности и необходимо начать профилирование libGDX игры или приложения.

FPSLogger

FPSLogger – простой вспомогательный класс в libGDX для логирования в игре количества кадров в секунду. Просто вызовите log() метод при визуализации. Вывод будет логироваться один раз в секунду.

PerformanceCounter

PerformanceCounter отслеживает время выполнения и загрузку (в процентах от общего времени) конкретной задачи. Просто, перед началом выполнения задачи вызовите start() метод и соответственно, после завершения вызовите stop() метод. Если необходимо, то вы можете делать это несколько раз. Для обновления значений, вызывайте tick() метод при каждой визуализации или обновлении. time FloatCounter предоставляет минимальное, максимальное, среднее, общее и текущее время выполнения задачи. Точно также и для значения load, которое представляет процент от общего времени.

OpenGL профилирование

Профилирование фактических вызовов OpenGL, которые происходят вовремя игрового процесса, сделать не очень легко, так как libGDX пытается абстрагировать все низкоуровневые вещи. Чтобы иметь возможность сбора такое информации в libGDX есть GLProfiler.

Чтобы задействовать GLProfiler, вам нужно вызвать статический метод GLProfiler.enable(). Данным вызовом, оригинальные экземпляры GL20 и GL30 будет заменены профайлерами.

Теперь профилирование активно и начинается мониторинг фактических OpenGL вызовов в libGDX. Одна из информации, которая может заинтересовать вас, это количество происходящих привязок текстур, которые дорогостоящие и могут замедлить вашу игру. Для оптимизации вы можете начать использовать TextureAtlas. Чтобы быть уверенным, что число привязок текстур в игре стало меньше, вы можете проверять статическое поле GLProfiler.textureBindings профайлера.

Возможно, вы хотите реализовать что-то вроде отсечения вида для визуализации только тех вещей, которые видны на экране. Статическое поле GLProfiler.drawCalls покажет вам результат такой оптимизации.

В настоящее время, профайлером предоставляется следующая информация:

  • Общее количество OpenGL вызовов.
  • Количество вызовов рисования.
  • Количество привязок текстур.
  • Количество шейдерных переключений.
  • Количество использованных вершин.

GLProfiler.vertexCount на самом деле это FloatCounter, но кроме GLProfiler.vertexCount.total, он имеет больше информации, такой как GLProfiler.vertexCount.min, GLProfiler.vertexCount.max и GLProfiler.vertexCount.average, которые являются значениями, основанными на отдельных вызовах методов визуализации.

Чтобы сбросить все эти значения, после того как вы прочитали и отобразили их (вероятно, один раз за кадр), вы должны вызвать GLProfiler.reset() метод. Чтобы полностью отключить профилирование и заменить профайлеры настоящими GL20 и GL30 экземплярами, используйте GLProfiler.disable() метод.

В случае, если вы используете Gdx.graphics.getGL20() или Gdx.graphics.getGL30() методы, вы минуете профайлер, и поэтому следует напрямую использовать Gdx.gl20 или Gdx.gl30.

Чтобы увидеть, как использовать профилирование в libGDX, смотрите Benchmark3DTest.