Библиотека Android Frame Pacing, также известная как Swappy, является частью Android Game SDK . Она помогает играм OpenGL и Vulkan добиться плавного рендеринга и правильного темпа кадров на Android.
Frame pacing — это синхронизация логики игры и цикла рендеринга с подсистемой отображения ОС и базовым аппаратным обеспечением отображения. Подсистема отображения 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, используя только изменения на стороне платформы и не требуя никаких действий со стороны разработчиков.
Реализация вмешательства по регулированию FPS использует следующие компоненты:
GameManagerService
Компонент GameManagerService хранит всю информацию о режиме игры и вмешательстве в игру для каждого пользователя и для каждой игры. Информация о FPS хранится в GameManagerService вместе с другой информацией о вмешательстве, такой как коэффициент уменьшения разрешения, в сопоставлении <PACKAGE_NAME, Interventions>
для каждого профиля пользователя. Информация о FPS доступна при изменении режима игры или обновлении вмешательства. UID
уникален для каждого PACKAGE_NAME
и пользователя и может быть далее преобразован в пару <UID, Frame Rate>
для отправки в SurfaceFlinger.
SurfaceFlinger
Компонент SurfaceFlinger уже поддерживает регулирование FPS приложения, пока частота кадров является делителем частоты обновления дисплея. В случае vsync SurfaceFlinger проверяет действительность vsync для регулируемого приложения, проверяя, совпадает ли временная метка vsync с частотой кадров приложения. Если частота кадров не совпадает с vsync, то SurfaceFlinger удерживает кадр до тех пор, пока частота кадров и vsync не совпадут по фазе.
На следующем рисунке показано взаимодействие между GameManagerService и SurfaceFlinger:

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