Шаг кадров

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

Чтобы узнать больше, см. Достижение правильного темпа кадров .

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

Вмешательство в регулирование частоты кадров (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:

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

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

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

Чтобы узнать больше о регулировании FPS, см. Введение в регулирование FPS .