Медленные сеансы

В Android Vitals медленным считается сеанс, в котором более 25% кадров медленные, Кадр считается медленным, если он появляется более чем через 50 мс после предыдущего (эквивалентно 20 кадр/с). В Android Vitals также есть второй показатель медленных сеансов с целевым значением 34 мс (эквивалентно 30 кадр/с). Сведения о медленных сеансах помогают оценить производительность приложения, которая влияет на плавность игрового процесса.

Со временем в Google Play ваша игра перестанет показываться для тех пользователей, на устройствах которых не удается достичь частоты 20 кадр/с. Обратите внимание, что в Android Vitals частота кадров начинает отслеживаться, только если сеанс игры длится не менее одной минуты.

Подробную информацию об этом показателе вы найдете в Справочном центре.

Графика в виде круговой диаграммы, на которой показано количество медленных и обычных кадров.
Рисунок 1. Медленный сеанс в Android Vitals.

Как измерить частоту кадров и обнаружить медленные кадры

Команда Android dumpsys SurfaceFlinger --timestats позволяет получить среднее значение FPS и гистограммы времени present to present для всех отрисовываемых слоев. Время между кадрами – это интервал между отрисовкой текущего и предыдущего кадров. Чтобы собрать данные о частоте кадров в игре, выполните следующие действия:

  1. Чтобы начать сбор информации, выполните команду с параметрами enable и clear:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Когда игра будет запущена достаточно долго, снова выполните команду с флагом dump, чтобы получить информацию:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    В дампе содержится информация об общем количестве кадров и гистограмма presentToPresent для всех слоев, отрисованных SurfaceFlinger. Чтобы найти нужный раздел игры, отфильтруйте данные по layerName:

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    Вы можете рассчитать низкую частоту кадров сеанса на основе информации о каждом слое.

    Например, процент медленных кадров при 20 кадр/с = (сумма значений от 54 до 1000 мс) / totalFrames x 100.

    totalFrames = 274
    ...
    presentToPresent histogram:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0
    66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    В дампе также показано среднее количество кадров в секунду для каждого слоя:

    ...
    averageFPS = 30.179
    ...
    
  3. После сбора всей информации отключите timestats с помощью флага disable:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Причины медленной отрисовки кадров и способы решения проблемы

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

Чтобы устранить эти проблемы и повысить производительность игры, используйте Android Frame Pacing (Swappy), Vulkan и ADPF.

Что такое Swappy

Библиотека Android Frame Pacing, также известная как Swappy, входит в состав библиотек AGDK. Swappy помогает играм на OpenGL и Vulkan достичь плавной отрисовки и правильной смены кадров на Android.

Синхронизация кадров – это синхронизация логики игры и цикла рендеринга с подсистемой отображения ОС и базовым аппаратным обеспечением дисплея. Подсистема отображения Android была разработана таким образом, чтобы избежать визуальных артефактов (известных как разрывы), которые могут возникать, когда аппаратное обеспечение дисплея переключается на новый кадр в процессе обновления. Чтобы избежать этих артефактов, подсистема дисплея делает следующее:

  • Буферизует предыдущие кадры.
  • Обнаруживает задержки в отправке кадров.
  • Повторяет показ прошлых кадров, когда обнаруживаются задержки.

Узнайте, как разработчики Mir 2 использовали Swappy, чтобы снизить долю медленных сеансов с 40% до 10%.

Как использовать Swappy в нативных проектах

Чтобы интегрировать библиотеку Android Frame Pacing в игру, ознакомьтесь со следующими руководствами:

Как использовать Swappy в игровом движке Unity

В движок Unity уже интегрирована библиотека Android Frame Pacing. Чтобы включить эту функцию в Unity 2019.2 или более поздней версии, установите флажок Optimized Frame Pacing (Оптимизированная смена кадров) в разделе Project Settings (Настройки проекта) > Player (Проигрыватель) > Settings (Настройки) для Android > Resolution and Presentation (Разрешение и представление).

Окно настроек проекта Unity с флажком Optimized Frame Pacing.
Рисунок 2. Включите синхронизацию кадров в Unity Engine.

Вы также можете программно включить в логическом коде оптимизированную синхронизацию кадров, чтобы Unity равномерно распределял кадры и частота кадров была более стабильной, а игровой процесс – более плавным.

Как использовать Swappy в игровом движке Unreal

В Unreal 4.25 и более поздних версиях интегрирована библиотека Android Frame Pacing Library, которая входит в Android Game Development Kit. В статье Mobile Frame Pacing рассказывается, как включить библиотеку Android Frame Pacing Library и управлять синхронизацией кадров с помощью кода C++.

Что такое Vulkan

Vulkan – это современный кросс-платформенный API для работы с 3D-графикой, который позволяет минимизировать абстракцию между графическим оборудованием устройства и игрой. Vulkan – это основной низкоуровневый графический API для Android, который заменяет OpenGL ES. OpenGL ES по-прежнему поддерживается на Android, но больше не развивается.

Vulkan имеет следующие преимущества перед OpenGL ES:

  • Более эффективная архитектура с меньшей нагрузкой на ЦП в графическом драйвере.
  • Новые стратегии оптимизации для повышения производительности ЦП
  • Новые графические функции, недоступные в OpenGL ES, такие как bindless API и трассировка лучей.

Как использовать Vulkan в нативных проектах для Android

В практической работе Начало работы с Vulkan на Android рассказывается, как настроить конвейер рендеринга Vulkan и отрисовать на экране текстурированный вращающийся треугольник. Пройдите практическую работу, чтобы узнать, как отрисовывать графику в игре.

Как использовать Vulkan в игровом движке Unity

Чтобы включить автоматический выбор устройства в Unity, следуйте инструкциям по настройке Auto Graphics API.

Окно настроек проекта Unity с включенным Auto Graphics API.
Рисунок 3. Включите Unity Auto Graphics API.

Вы также можете включить Vulkan вручную, отключив Auto Graphics API (Автоматический выбор графического API) и поместив Vulkan на первое место в списке Graphics APIs (Графические API). Если вы используете Unity 2021.1 или более раннюю версию, это единственный способ использовать Vulkan.

Окно настроек проекта Unity с Vulkan в качестве приоритетного графического API.
Рисунок 4. Вручную выберите Vulkan в качестве основного графического API в Unity.

Используйте плагин VkQuality для движка Unity, чтобы получать рекомендации по выбору графического API для игры на определенных устройствах.

Как использовать Vulkan в игровом движке Unreal

Чтобы включить Vulkan Graphics API, перейдите в раздел Project Settings (Настройки проекта) > Platforms (Платформы) > Android > Build (Сборка) и выберите Support Vulkan (Поддержка Vulkan). Если вы выберете и Support Vulkan (Поддержка Vulkan), и Support OpenGL ES3.2 (Поддержка OpenGL ES3.2), Unreal будет по умолчанию использовать Vulkan. Если устройство не поддерживает Vulkan, Unreal использует OpenGL ES 3.2.

Окно настроек проекта Unreal Engine с параметром Support Vulkan (Поддержка Vulkan).
Рисунок 5. Включите Vulkan в Unreal Engine.

Если вы используете определенные функции Vulkan, которые некорректно работают на некоторых устройствах, вы можете настроить файл BaseDeviceProfile.ini так, чтобы исключить эти устройства. Чтобы узнать, как настроить BaseDeviceProfile.ini, ознакомьтесь со статьей Customizing Device Profiles and Scalability for Android (Настройка профилей устройств и масштабируемости для Android). Поскольку новые драйверы устройств могут устранять ранее известные проблемы, обновляйте файл BaseDeviceProfile.ini, чтобы получать все оптимизации.

Что такое ADPF

Android Dynamic Performance Framework (ADPF) оптимизирует игры на основе динамического управления температурой, ЦП и графическим процессором на Android. Они предназначены в первую очередь для игр, но их можно использовать и в других приложениях, требующих высокой производительности.

ADPF – это набор API, которые позволяют играм и приложениям, требующим высокой производительности, напрямую взаимодействовать с системами питания и охлаждения устройств Android. С помощью этих API вы можете отслеживать динамическое поведение в системах Android и оптимизировать производительность игр на устойчивом уровне, который не приводит к перегреву устройств.

Вот основные функции ADPF:

  • Thermal API. Позволяет отслеживать тепловое состояние устройства, чтобы приложение могло заранее скорректировать рабочую нагрузку, прежде чем она станет критической.
  • CPU Performance Hint API. Позволяет предоставлять подсказки, которые помогают Android выбирать подходящие настройки производительности (например, рабочую точку или ядро ЦП) для рабочей нагрузки.
  • Game Mode API и Game State API. Позволяют оптимизировать игровой процесс, отдавая приоритет производительности или времени работы от батареи в зависимости от настроек пользователя и конфигурации игры.
  • Режим фиксированной производительности. Включите его на устройстве во время тестирования, чтобы получить результаты, не зависящие от динамического изменения тактовой частоты процессора.
  • Режим энергосбережения. Указывает, что потоки в сеансе подсказок о производительности можно безопасно планировать, отдавая предпочтение энергоэффективности, а не производительности. Доступно в Android 15 (уровень API 35).

Как использовать ADPF в нативных проектах для Android

В практической работе Интеграция функций адаптивности в нативную игру рассказывается, как добавить функции ADPF в игру. Вы можете выполнять инструкции в удобном для вас темпе. В конце практической работы вы интегрируете следующие функции:

  • Thermal API. Отслеживайте температуру устройства и реагируйте до того, как оно перейдет в режим троттлинга.
  • Game Mode API. Позволяет узнать, что предпочитают игроки – максимальную производительность или экономию заряда батареи, – и настроить игру соответствующим образом.
  • Game State API. Позволяет системе узнавать состояние игры (загрузка, игровой процесс, интерфейс и т. д.) и соответствующим образом корректировать ресурсы (увеличивать скорость I/O, производительность ЦП, графического процессора и т. д.).
  • Performance Hint API. Позволяет сообщить системе о модели потоков и рабочей нагрузке, чтобы она могла соответствующим образом распределить ресурсы.

Как использовать ADPF в игровом движке Unity

Unity Adaptive Performance – это инструмент для разработчиков, которые хотят оптимизировать свои игры для мобильных устройств, в частности для разнообразной экосистемы Android. Adaptive Performance позволяет игре в реальном времени адаптироваться к производительности и температуре устройства, обеспечивая плавный и эффективный игровой процесс.

Поставщик Adaptive Performance для Android – руководство по внедрению ADPF в Unity. Также ознакомьтесь с информацией о поставщике Android и адаптивной производительности ADPF Unity.

Окно настроек проекта Unity, в котором показаны настройки поставщика Adaptive Performance для Android.
Рисунок 6. Интегрируйте ADPF в Unity Engine.

Как использовать ADPF в игровом движке Unreal

Окно плагинов Unreal Engine, в котором показан плагин Android Dynamic Performance Framework.
Рисунок 7. Интегрируйте ADPF в Unreal Engine.
  1. Скачайте плагин.
  2. Скопируйте плагин в папку плагинов проекта.
  3. Включите плагин ADPF Unreal Engine в редакторе Unreal.
  4. Перезапустите редактор Unreal.
  5. Скомпилируйте и упакуйте игру.

Плагин Android Dynamic Performance Framework (ADPF) для Unreal Engine обеспечивает стабильную производительность и предотвращает троттлинг. Скачайте плагин с GitHub. Этот плагин изменяет функции, задавая значения консоли Unreal. Подробнее о плагине ADPF для Unreal Engine…