В этом руководстве описан процесс анализа и оптимизации производительности игр на устройствах Android для обеспечения плавной работы. Рассматриваются способы выявления узких мест в производительности, различение проблем, связанных с процессором и видеокартой, а также проверка результатов оптимизации.
Независимо от того, насколько увлекательна или интересна игра, если она плохо работает на мобильных устройствах, игроки не получат от неё удовольствия, и она не будет столь успешной. Даже в увлекательных играх могут возникать проблемы, такие как низкая частота кадров (FPS) или перегрев устройства. Эти проблемы расстраивают игроков. Поэтому улучшение производительности игры крайне важно, и необходимо понимать, как её оптимизировать.
Процесс оптимизации производительности включает следующие этапы:
Измерение общей производительности игры. Количественная оценка снижения производительности в каждой сцене для выявления аномалий.
Проверка на зависимость от ЦП и ГП. Выяснение основной причины, является ли она зависимостью от ЦП или ГП.
Инструменты: Unreal Insight, Unity Profiler, Perfetto и инструменты измерения производительности.
Оптимизация ЦП. Устранение выявленных узких мест в производительности.
Инструменты: Unreal Insight, Unity Profiler, Perfetto и Simpleperf.
Оптимизация графического процессора. Устранение выявленных узких мест в производительности.
Инструменты: RenderDoc, Arm mobile studio, AGI, инструмент от производителя.
A/B-тестирование. Проведите A/B-тестирование для тщательной проверки эффективности внедренных оптимизаций.
Инструменты: Unreal Insight, Unity Profiler, Perfetto, инструменты измерения производительности, блокировка частоты ЦП или ГП, а также RenderDoc.
Этот итеративный процесс (1-5) продолжается до тех пор, пока не будут успешно достигнуты целевые значения FPS и температурные параметры.
Предварительные требования
Подготовьте сборку игры для тестирования на устройстве под управлением Android.
Установите следующие инструменты:
Проанализируйте общую производительность игры.
Необходимо проверить общую производительность игры и выявить любые сбои или отклонения в производительности, связанные с отдельными сценами. Перед оптимизацией игры проверьте её текущую производительность. Поскольку игры включают множество пользовательских интерфейсов и сцен, проанализируйте сцены с высокой загрузкой ЦП или ГП, а также сцены с неожиданно низкой производительностью, чтобы отслеживать снижение производительности и загрузку ЦП или ГП для каждой сцены.
- Количественная оценка снижения производительности: Используйте инструменты измерения производительности для оценки общей производительности игры. Измеряйте производительность для каждой сцены отдельно, чтобы выявить конкретные области со снижением производительности или отклонениями от нормы.
- Выявление проблемных сцен: Проанализируйте данные, чтобы найти сцены с высокой загрузкой ЦП или ГП, или там, где расположение элементов на экране не обеспечивает ожидаемой производительности.
- Сбор данных трассировки: Используйте инструменты трассировки для сбора подробных данных о производительности в выявленных проблемных сценах.
Выявите узкие места в работе процессора или видеокарты.
Если игра не достигает целевой частоты кадров, определите, является ли причиной проблемы процессор или видеокарта. Анализ поведения процессора и видеокарты имеет решающее значение для поиска возможностей оптимизации, даже если устройство перегревается или потребляет слишком много энергии во время игры. Для определения того, является ли проблема процессора или видеокарты, можно использовать различные методы.
Анализ данных трассировки: Используйте предпочитаемый вами инструмент для анализа данных трассировки:
- Unreal Insight (Unreal Engine): Проанализируйте трассировку, чтобы увидеть время выполнения потоков
GameThread,RenderThreadиRHIThread.- Если
GameThreadилиRenderThreadпревышают лимит времени кадра (например, 33,3 мс при 30 кадрах в секунду), игра становится ресурсоемкой для процессора . - Если поток
RHIThreadвыполняется слишком долго или занимает большую часть времени кадра, игра ограничена производительностью графического процессора .
- Если

Рисунок 2. Трассировка Unreal Insight с использованием GameThread, RenderThread и RHIThread (нажмите для увеличения). - Профайлер Unity (Unity): Если основной поток тратит значительное время на такие маркеры, как
Gfx.WaitForPresentOnGfxThreadв то время как поток рендеринга показываетGfx.PresentFrameили<GraphicsAPIName>.WaitForLastPresent, игра ограничена производительностью графического процессора .

Рисунок 3. Пример использования Unity Profiler с ограничением производительности графического процессора (нажмите для увеличения). - Perfetto: Анализ назначений ядер ЦП и деталей выполнения потоков. Этот анализ позволяет выявлять узкие места в производительности за счет детального изучения информации о выполнении потоков.
Нагрузка на ЦП: Трассировка показывает, что нагрузка на потоки
GameThreadиRenderThreadв сочетании с VSync является причиной задержек вQueuePresentпотока RHI, что указывает на ситуацию, когда производительность ЦП ограничена.
Рисунок 4. Трассировка Perfetto с подробными сведениями о выполнении на ЦП (нажмите для увеличения). Накладные расходы графического процессора: Если время завершения работы графического процессора превышает лимит времени кадра, например, 25 мс, игра становится ресурсоемкой . Трассировка показывает, что время завершения работы графического процессора превышает 25 мс, что указывает на ситуацию ресурсоемкости графического процессора.

Рисунок 5. Трассировка Perfetto с подробной информацией о накладных расходах графического процессора (нажмите для увеличения).
- Unreal Insight (Unreal Engine): Проанализируйте трассировку, чтобы увидеть время выполнения потоков
Используйте команды статистики Unreal Engine:
-
stat unit: Сравните время, выделенное потокам игры, отрисовки и RHI. Если время, выделенное для игры и отрисовки, невелико, но время RHI постоянно превышает лимит времени кадра, игра ограничена производительностью графического процессора . Например, если требуемая частота кадров составляет 30 (эквивалентно 33,33 мс на кадр), и время, выделенное для потоков игры и отрисовки, постоянно находится в диапазоне 10-15 мс, но время, выделенное для RHI, постоянно превышает 30 мс, это убедительно указывает на ограничение производительности графического процессора.

Рисунок 6. Блок статистики облегчает оценку условий, ограничивающих производительность графического процессора. -
stat VulkanRHI: Проверьте продолжительность отправки и присутствия очереди.

Рисунок 7. Stat VulkanRHI облегчает оценку условий, ограничивающих производительность графического процессора (нажмите для увеличения). -
stat slow: Проанализируйте время, выделенное потокам Game, Render и RHI, чтобы выявить препятствия.
-
Проверьте показатели производительности: используйте результаты комплексного анализа производительности игры . На Android:
- Зависимость от ЦП: загрузка ЦП (в нормализованном виде) превышает 15%, при этом загрузка графического процессора низкая, а частота кадров низкая.
- Зависимость от производительности графического процессора: использование графического процессора превышает 90%.
Как правило, если частота кадров и загрузка графического процессора низкие, а загрузка центрального процессора превышает 15%, ситуацию можно считать "критической" (cPU-to-strict).

Рисунок 8. Показатели производительности с учетом использования ЦП и ГП.
Оптимизация производительности процессора
Если анализ показывает, что игра сильно нагружает процессор, проведите дальнейшее исследование, чтобы выявить конкретные потоки или API, вызывающие узкое место.
Подробные инструкции см. в разделе «Советы по оптимизации ЦП и ГП для Android» .
Оптимизация производительности графического процессора
Если анализ показывает, что игра ограничена производительностью графического процессора, проведите дальнейшее исследование с помощью отладчиков кадров, чтобы проанализировать конвейер рендеринга и вызовы отрисовки.
Подробные инструкции см. в разделе «Советы по оптимизации ЦП и ГП для Android» .
Проверьте эффективность оптимизации.
- Проведите A/B-тестирование: создайте сборку с реализованными оптимизациями.
- Измерение производительности: Используйте те же инструменты и методы, что и при первоначальном анализе, для измерения производительности оптимизированной сборки.
- Сравнение результатов: Сравните новые данные о производительности с исходными данными, чтобы подтвердить, что выявленные узкие места устранены и что целевые показатели FPS и температуры достигнуты.
- Итерация: Повторяйте этапы анализа и оптимизации до достижения желаемого уровня производительности.