Медленные сеансы (только игры)

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

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

Для получения более подробной информации о данном показателе посетите наш Справочный центр .

Круговые диаграммы, показывающие количество медленных и нормальных кадров.
Рисунок 1. Медленная работа приложения Android Vitals.

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

Команда Android dumpsys surfaceflinger timestats предоставляет данные о среднем FPS и гистограмму времени отрисовки каждого текущего слоя. Время отрисовки кадра — это интервал между текущим и предыдущим отрисованными кадрами. Вот пошаговая инструкция по использованию команды для сбора данных о FPS вашей игры:

  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 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
    ...
    
  3. После сбора всей информации следует отключить отображение статистики времени, используя флаг 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 в вашу игру:

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

В Unity интегрирована функция синхронизации кадров Android. Чтобы включить эту функцию в Unity 2019.2 или более поздних версиях, установите флажок «Оптимизированная синхронизация кадров» в разделе «Настройки проекта» > «Плеер» > «Настройки для Android» > «Разрешение и отображение» .

Диалоговое окно настроек проекта.
Рисунок 2. Включение синхронизации кадров в Unity Engine.

В качестве альтернативы, вы можете программно включить параметр «Оптимизированная синхронизация кадров» в своем коде, чтобы позволить 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 .

Диалоговое окно настроек проекта.
Рисунок 3. Включение автоматического графического API Unity.

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

Диалоговое окно настроек проекта.
Рисунок 4. Ручной выбор Vulkan в качестве основного графического API в Unity.

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

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

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

Диалоговое окно настроек проекта.
Рисунок 5. Включение Vulkan в Unreal Engine.

Если вы используете определенные функции 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.

Диалоговое окно настроек проекта.
Рисунок 6. Интеграция ADPF в Unity Engine.

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

Диалоговое окно настроек проекта.
Рисунок 7. Интеграция ADPF в Unreal Engine.
  1. Скачайте плагин
  2. Скопируйте плагин в папку плагинов проекта.
  3. Включите плагин ADPF Unreal Engine в редакторе Unreal Engine.
  4. Перезапуск редактора Unreal
  5. Создайте и приготовьте игру.

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