Шаг кадров

Библиотека 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 см.:

Более подробную информацию см. в библиотеке Frame Pacing .

Вмешательство в регулирование количества кадров в секунду

Вмешательство в регулирование частоты кадров (FPS) позволяет играм поддерживать нужный FPS, используя только изменения на стороне платформы и не требуя никаких действий со стороны разработчиков.

Реализация вмешательства в регулирование FPS использует следующие компоненты.

GameManagerService

Компонент GameManagerService хранит всю информацию об игровом режиме и вмешательстве для каждого пользователя и каждой игры. Информация о частоте кадров хранится в GameManagerService вместе с другой информацией о вмешательстве, например, о коэффициенте понижения разрешения, в сопоставлении <PACKAGE_NAME, Interventions> для каждого профиля пользователя. Информация о частоте кадров доступна при изменении игрового режима или обновлении вмешательства. Идентификатор UID уникален для каждого PACKAGE_NAME и пользователя и может быть преобразован в пару <UID, Frame Rate> для отправки в SurfaceFlinger.

SurfaceFlinger

Компонент SurfaceFlinger уже поддерживает ограничение FPS приложения, пока частота кадров делится на частоту обновления экрана. В случае вертикальной синхронизации (VSync) SurfaceFlinger проверяет корректность вертикальной синхронизации (VSync) для приложения, на которое наложен троттлинг, проверяя, совпадает ли временная метка VSync по фазе с частотой кадров приложения. Если частота кадров не совпадает по фазе с вертикальной синхронизацией (VSync), SurfaceFlinger удерживает кадр до тех пор, пока частота кадров и вертикальная синхронизация не совпадут по фазе.

На следующем рисунке показано взаимодействие GameManagerService и SurfaceFlinger:

Взаимодействие между GameManagerService и SurfaceFlinger

Рисунок 1. Взаимодействие между GameServiceManager и SurfaceFlinger.

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

Более подробную информацию о регулировании FPS см. в разделе Регулирование FPS .