В Android Vitals медленным считается сеанс, в котором более 25% кадров медленные, Кадр считается медленным, если он появляется более чем через 50 мс после предыдущего (эквивалентно 20 кадр/с). В Android Vitals также есть второй показатель медленных сеансов с целевым значением 34 мс (эквивалентно 30 кадр/с). Сведения о медленных сеансах помогают оценить производительность приложения, которая влияет на плавность игрового процесса.
Со временем в Google Play ваша игра перестанет показываться для тех пользователей, на устройствах которых не удается достичь частоты 20 кадр/с. Обратите внимание, что в Android Vitals частота кадров начинает отслеживаться, только если сеанс игры длится не менее одной минуты.
Подробную информацию об этом показателе вы найдете в Справочном центре.
Как измерить частоту кадров и обнаружить медленные кадры
Команда Android dumpsys SurfaceFlinger --timestats позволяет получить среднее значение FPS и гистограммы времени present to present для всех отрисовываемых слоев. Время между кадрами – это интервал между отрисовкой текущего и предыдущего кадров. Чтобы собрать данные о частоте кадров в игре, выполните следующие действия:
Чтобы начать сбор информации, выполните команду с параметрами
enableиclear:adb shell dumpsys SurfaceFlinger --timestats -clear -enableКогда игра будет запущена достаточно долго, снова выполните команду с флагом
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 ...После сбора всей информации отключите 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 в игру, ознакомьтесь со следующими руководствами:
- Как интегрировать Android Frame Pacing в средство визуализации OpenGL
- Как интегрировать Android Frame Pacing в средство визуализации Vulkan
Как использовать Swappy в игровом движке Unity
В движок Unity уже интегрирована библиотека Android Frame Pacing. Чтобы включить эту функцию в Unity 2019.2 или более поздней версии, установите флажок Optimized Frame Pacing (Оптимизированная смена кадров) в разделе Project Settings (Настройки проекта) > Player (Проигрыватель) > Settings (Настройки) для Android > Resolution and Presentation (Разрешение и представление).
Вы также можете программно включить в логическом коде оптимизированную синхронизацию кадров, чтобы 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.
Вы также можете включить Vulkan вручную, отключив Auto Graphics API (Автоматический выбор графического API) и поместив Vulkan на первое место в списке Graphics APIs (Графические API). Если вы используете Unity 2021.1 или более раннюю версию, это единственный способ использовать Vulkan.
Используйте плагин 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.
Если вы используете определенные функции 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.
Как использовать ADPF в игровом движке Unreal
- Скачайте плагин.
- Скопируйте плагин в папку плагинов проекта.
- Включите плагин ADPF Unreal Engine в редакторе Unreal.
- Перезапустите редактор Unreal.
- Скомпилируйте и упакуйте игру.
Плагин Android Dynamic Performance Framework (ADPF) для Unreal Engine обеспечивает стабильную производительность и предотвращает троттлинг. Скачайте плагин с GitHub. Этот плагин изменяет функции, задавая значения консоли Unreal. Подробнее о плагине ADPF для Unreal Engine…