Библиотека Android Frame Pacing, также известная как Swappy, является частью Android Game SDK . Это помогает играм OpenGL и Vulkan добиться плавного рендеринга и правильной синхронизации кадров на Android.
Стимулирование кадров — это синхронизация игровой логики и цикла рендеринга с подсистемой отображения ОС и базовым оборудованием отображения. Подсистема отображения Android была разработана таким образом, чтобы избежать определенных визуальных артефактов, таких как разрывы. Подсистема отображения избегает разрывов, выполняя следующие действия:
- Внутренняя буферизация прошлых кадров
- Обнаружение поздней отправки кадров
- Продолжение отображения текущего кадра при обнаружении позднего кадра
Несогласованное время отображения кадров вызвано тем, что цикл рендеринга в игре выполняется с частотой, отличной от той, которую поддерживает аппаратное обеспечение собственного дисплея. Проблемы возникают, когда цикл рендеринга игры выполняется слишком медленно для базового оборудования дисплея, что приводит к несогласованному времени отображения. Например, когда игра, работающая со скоростью 30 кадров в секунду, пытается выполнить рендеринг на устройстве, изначально поддерживающем 60 кадров в секунду, цикл рендеринга игры приводит к тому, что повторяющийся кадр остается на экране в течение дополнительных 16 мс. Этот тип отключения создает существенные несоответствия во времени кадра, например, 33 мс, 16 мс, 49 мс и т. д. Чрезмерно сложные сцены еще больше усугубляют эту проблему, поскольку они приводят к пропуску кадров.
Библиотека Frame Pacing выполняет следующие задачи:
- Компенсирует заикание из-за коротких игровых кадров.
- Добавляет метки времени презентации, чтобы кадры представлялись вовремя, а не раньше.
- Использует расширения временной метки презентации
EGL_ANDROID_presentation_time
иVK_GOOGLE_display_timing
.
- Использует границы синхронизации для длинных кадров, что приводит к заиканию и задержке.
- Внедряет ожидания в приложение. Это позволяет конвейеру дисплея наверстать упущенное, а не создавать обратное давление.
- Использует заборы синхронизации (
EGL_KHR_fence_sync
иVkFence
).
- Выбирает частоту обновления, чтобы обеспечить гибкость и плавность презентации, если ваше устройство поддерживает несколько частот обновления.
- Предоставляет статистику для отладки и профилирования с использованием статистики кадров .
Чтобы узнать, как настроить библиотеку для работы в различных режимах в соответствии с вашими потребностями, см. Поддерживаемые режимы работы .
Чтобы реализовать использование средства визуализации OpenGL или средства визуализации Vulkan, см.
- Интегрируйте Android Frame Pacing в средство визуализации OpenGL.
- Интегрируйте Android Frame Pacing в ваш модуль визуализации Vulkan
Чтобы узнать больше, см. Достижение правильного шага кадров .
Кадров в секунду (FPS) Вмешательство в регулирование
FPS Throttling Intervention позволяет играм работать с соответствующим FPS, используя только изменения на стороне платформы и не требуя каких-либо действий со стороны разработчиков.
Реализация вмешательства по регулированию FPS использует следующие компоненты:
GameManagerService
Компонент GameManagerService поддерживает всю информацию о режиме игры и вмешательстве в игру для каждого пользователя и для каждой игры. Информация о частоте кадров хранится в GameManagerService вместе с другой информацией о вмешательстве, такой как коэффициент уменьшения разрешения, в <PACKAGE_NAME, Interventions>
для каждого профиля пользователя. Информация о частоте кадров доступна при изменении режима игры или обновлении вмешательства. UID
уникален для каждого PACKAGE_NAME
и пользователя и может быть преобразован в пару <UID, Frame Rate>
для отправки в SurfaceFlinger.
SurfaceFlinger
Компонент SurfaceFlinger уже поддерживает регулирование FPS приложения, если частота кадров является делителем частоты обновления дисплея. В случае вертикальной синхронизации SurfaceFlinger проверяет достоверность вертикальной синхронизации для регулируемого приложения, проверяя, совпадает ли временная метка вертикальной синхронизации с частотой кадров приложения. Если частота кадров не совпадает по фазе с вертикальной синхронизацией, то SurfaceFlinger удерживает кадр до тех пор, пока частота кадров и вертикальная синхронизация не совпадают по фазе.
На следующем рисунке показано взаимодействие между GameManagerService и SurfaceFlinger:

Рисунок 1. Взаимодействие между GameServiceManager и SurfaceFlinger
SurfaceFinger поддерживает сопоставление пары <UID, Frame Rate>
для установки нового приоритета регулирования частоты кадров. UID
уникален для пользователей и игр, поэтому каждый пользователь на одном устройстве может иметь разные настройки частоты кадров в одной и той же игре. Чтобы ограничить частоту кадров в игре, GameServiceManager вызывает SurfaceFlinger, чтобы переопределить частоту кадров для UID. С помощью этого механизма SurfaceFlinger обновляет сопоставление всякий раз, когда изменяется игровой режим или обновляется вмешательство. SurfaceFlinger обрабатывает изменение FPS, соответствующим образом фиксируя буферы.
Чтобы узнать больше о регулировании FPS, см. раздел Введение в регулирование FPS .