Библиотека 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, используя только изменения на стороне платформы и не требуя каких-либо действий со стороны разработчиков.
Реализация регулирования FPS использует следующие компоненты:
GameManagerService
Компонент GameManagerService хранит всю информацию об игровом режиме и вмешательстве для каждого пользователя и каждой игры. Информация о FPS хранится в GameManagerService вместе с другой информацией о вмешательстве, такой как коэффициент уменьшения разрешения, в сопоставлении <PACKAGE_NAME, Interventions>
для каждого профиля пользователя. Доступ к информации о FPS осуществляется при изменении режима игры или обновлении вмешательства. UID
уникален для каждого PACKAGE_NAME
и пользователя и может быть дополнительно преобразован в пару <UID, Frame Rate>
для отправки в SurfaceFlinger.
ПоверхностьФлингер
Компонент SurfaceFlinger уже поддерживает регулирование частоты кадров приложения, если частота кадров является делителем частоты обновления дисплея. В случае вертикальной синхронизации SurfaceFlinger проверяет достоверность вертикальной синхронизации для регулируемого приложения, проверяя, находится ли временная метка вертикальной синхронизации в фазе с частотой кадров приложения. Если частота кадров не совпадает по фазе с вертикальной синхронизацией, SurfaceFlinger удерживает кадр до тех пор, пока частота кадров и вертикальная синхронизация не совпадут по фазе.
На следующем рисунке показано взаимодействие между GameManagerService и SurfaceFlinger:
![Взаимодействие между GameManagerService и SurfaceFlinger](https://source.android.google.cn/static/docs/core/graphics/images/fps-throttling-flow.png?authuser=0&hl=ru)
Рис. 1. Взаимодействие между GameServiceManager и SurfaceFlinger.
SurfaceFinger поддерживает сопоставление пары <UID, Frame Rate>
, чтобы установить новый приоритет регулирования частоты кадров. UID
уникален для пользователей и игр, поэтому каждый пользователь на одном устройстве может иметь разные настройки частоты кадров в одной и той же игре. Чтобы ограничить частоту кадров в игре, GameServiceManager вызывает SurfaceFlinger, чтобы переопределить частоту кадров для UID. Благодаря этому механизму SurfaceFlinger обновляет сопоставление всякий раз, когда изменяется игровой режим или обновляется вмешательство. SurfaceFlinger обрабатывает изменение FPS, соответствующим образом фиксируя буферы.
Дополнительные сведения о регулировании FPS см. в разделе «Введение о регулировании FPS» .