Шаг кадров

Библиотека 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) позволяет играм поддерживать оптимальную частоту кадров, используя только изменения на уровне платформы и не требуя никаких действий со стороны разработчиков.

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

GameManager ло

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

SurfaceFlinger

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

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

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

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

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

Чтобы узнать больше о регулировании частоты кадров (FPS throttling), см. раздел «Регулирование FPS throttling» .