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

Как измерить частоту кадров и обнаружить замедление кадров
Команда Android dumpsys surfaceflinger timestats предоставляет данные о среднем FPS и гистограмму времени отрисовки каждого текущего слоя. Время отрисовки кадра — это интервал между текущим и предыдущим отрисованными кадрами. Вот пошаговая инструкция по использованию команды для сбора данных о FPS вашей игры:
Выполните команду с флагами
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 FPS = (сумма значений от 54 мс до 1000 мс) / общее количество кадров x 100
totalFrames = 274 ... presentToPresent histogram is as below: 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 ...После сбора всей информации следует отключить отображение статистики времени, используя флаг
disable:adb shell dumpsys SurfaceFlinger --timestats -disable
Причины и решения проблемы медленной работы системы обработки кадров
Существует множество причин, по которым кадр может отображаться или рендериться дольше на экране, чем планировалось разработчиком. Игра может быть ограничена производительностью процессора/видеокарты . Или устройство перегревается и переходит в режим снижения тепловой нагрузки . Или же существует несоответствие между частотой кадров игры и частотой обновления дисплея устройства .
Используйте Android Frame Pacing (Swappy) , Vulkan и ADPF для решения этих проблем и повышения производительности вашей игры.
Что такое Swappy?
Библиотека Android Frame Pacing , также известная как Swappy, является частью библиотек AGDK . Swappy помогает играм на Android с поддержкой OpenGL и Vulkan добиться плавной отрисовки и правильной синхронизации кадров.
Синхронизация кадров — это согласование логики игры и цикла рендеринга с подсистемой отображения операционной системы и базовым оборудованием дисплея. Подсистема отображения Android была разработана для предотвращения визуальных артефактов (известных как разрывы изображения), которые могут возникать, когда оборудование дисплея переключается на новый кадр в процессе обновления. Для предотвращения этих артефактов подсистема отображения выполняет следующие действия:
- Буферизует пропущенные кадры внутри системы.
- Обнаруживает запоздавшую отправку кадров.
- Повторное отображение предыдущих кадров при обнаружении кадров, отстающих от графика.
Узнайте, как Mir 2 использовал Swappy, чтобы снизить процент медленных сессий с 40% до 10% .
Как использовать Swappy в нативных проектах
Ознакомьтесь со следующими руководствами по интеграции библиотеки Android Frame Pacing в вашу игру:
- Интегрируйте функцию синхронизации кадров Android в ваш рендерер OpenGL.
- Интегрируйте функцию синхронизации кадров Android в ваш рендерер Vulkan.
Как использовать Swappy в игровом движке Unity
В Unity интегрирована функция синхронизации кадров Android. Чтобы включить эту функцию в Unity 2019.2 или более поздних версиях, установите флажок «Оптимизированная синхронизация кадров» в разделе «Настройки проекта» > «Плеер» > «Настройки для Android» > «Разрешение и отображение» .

В качестве альтернативы, вы можете программно включить параметр «Оптимизированная синхронизация кадров» в своем коде, чтобы позволить Unity равномерно распределять кадры, уменьшая колебания частоты кадров и обеспечивая более плавный игровой процесс.
Как использовать Swappy в игровом движке Unreal Engine
В Unreal Engine 4.25 и более поздних версиях интегрирована библиотека Android Frame Pacing , входящая в состав Android Game Development Kit . В статье о мобильной настройке частоты кадров объясняется, как включить библиотеку Android Frame Pacing и как управлять частотой кадров из кода C++.
Что такое Vulkan?
Vulkan — это современный кроссплатформенный API для 3D-графики, разработанный для минимизации абстракции между графическим оборудованием устройства и вашей игрой. Vulkan является основным низкоуровневым графическим API на Android, заменив OpenGL ES . OpenGL ES по-прежнему поддерживается на Android, но его активная разработка прекращена.
Vulkan предлагает следующие преимущества по сравнению с OpenGL ES:
- Более эффективная архитектура с меньшей нагрузкой на ЦП в графическом драйвере.
- Новые стратегии оптимизации для повышения производительности процессора.
- Новые графические возможности, недоступные в OpenGL ES, такие как API без привязки и трассировка лучей.
Как использовать Vulkan в нативных проектах Android
В этом руководстве по началу работы с Vulkan на Android вы узнаете, как настроить конвейер рендеринга Vulkan, а затем отобразить на экране текстурированный вращающийся треугольник. Используйте это руководство, чтобы научиться рендерить графику для вашей игры.
Как использовать Vulkan в игровом движке Unity
Чтобы включить автоматический выбор устройства в Unity, выполните следующие действия для настройки Auto Graphics API .

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

Используйте плагин VkQuality для Unity Engine , чтобы задать рекомендации по выбору графического API для вашей игры на конкретных устройствах во время запуска.
Как использовать Vulkan в игровом движке Unreal Engine
Чтобы включить графический API Vulkan, перейдите в «Настройки проекта» > «Платформы» > «Android» > «Сборка» и выберите «Поддержка Vulkan» . Если вы выберете одновременно «Поддержка Vulkan» и «Поддержка OpenGL ES3.2» , Unreal по умолчанию будет использовать Vulkan. Если устройство не поддерживает Vulkan, Unreal будет использовать OpenGL ES 3.2.

Если вы используете определенные функции Vulkan, которые, как известно, плохо работают на некоторых устройствах, вы можете настроить файл BaseDeviceProfile.ini , чтобы исключить эти устройства. Подробнее о настройке файла BaseDeviceProfile.ini можно узнать в статье «Настройка профилей устройств и масштабируемости для Android» . Поскольку новые драйверы устройств могут исправлять ошибки на ранее известных неисправных устройствах, регулярно обновляйте файл BaseDeviceProfile.ini , чтобы получать все оптимизации.
Что такое ADPF?
Технология Android Dynamic Performance Framework (ADPF) оптимизирует игры на основе функций динамического управления температурой, процессором и видеокартой в Android. Основное внимание уделяется играм, но эти функции можно использовать и для других ресурсоемких приложений.
ADPF — это набор API, позволяющих играм и ресурсоемким приложениям более напрямую взаимодействовать с системами питания и охлаждения устройств Android. С помощью этих API можно отслеживать динамическое поведение систем Android и оптимизировать производительность игр на устойчивом уровне, не допуская перегрева устройств.
Вот основные особенности сажевого фильтра:
- Thermal API : Мониторинг теплового состояния устройства, позволяющий приложению заблаговременно корректировать рабочую нагрузку до того, как она станет неприемлемой.
- API подсказок по производительности ЦП : Предоставляет подсказки по производительности, позволяющие Android выбрать правильные параметры производительности (например, рабочую точку ЦП или ядро) для рабочей нагрузки.
- API игрового режима и API состояния игры : позволяют оптимизировать игровой процесс, отдавая приоритет характеристикам производительности или времени автономной работы в зависимости от настроек пользователя и конфигураций конкретной игры.
- Режим фиксированной производительности : Включите режим фиксированной производительности на устройстве во время тестирования, чтобы получить результаты измерений, которые не изменяются при динамическом изменении тактовой частоты процессора.
- Режим энергоэффективности : сообщает сессии, что потоки в сессии подсказок по производительности могут быть безопасно запланированы с приоритетом энергоэффективности над производительностью. Доступно в Android 15 (уровень API 35).
Как использовать ADPF в нативных проектах Android
Практический семинар «Интеграция функций адаптивности в вашу нативную игру» поможет вам интегрировать функции ADPF в вашу игру, выполняя шаги в удобном для вас темпе. По завершении семинара вы интегрируете следующие функции:
- Thermal API : Отслеживает температурный режим устройства и реагирует до того, как устройство перейдет в режим регулирования температуры.
- API игрового режима : Анализ предпочтений игрока в оптимизации (максимизация производительности или экономия заряда батареи) и соответствующая корректировка.
- API состояния игры : позволяет системе отслеживать состояние игры (загрузка, игра, пользовательский интерфейс и т. д.), после чего система может соответствующим образом регулировать ресурсы (увеличивать скорость ввода-вывода, процессора, видеокарты и т. д.).
- API подсказок по производительности : позволяет системе узнать модель многопоточности и рабочую нагрузку, чтобы она могла соответствующим образом распределять ресурсы.
Как использовать ADPF в игровом движке Unity
Функция Adaptive Performance в Unity — это инструмент для разработчиков игр, стремящихся оптимизировать свои игры на мобильных устройствах, особенно для разнообразной экосистемы Android. Adaptive Performance позволяет вашей игре адаптироваться к производительности и тепловым характеристикам устройства в режиме реального времени, обеспечивая плавный и эффективный игровой процесс.
Адаптивный поставщик производительности Android (ADPF) проведет вас через все этапы внедрения ADPF в Unity.

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

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