Кадровая стимуляция

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

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

Кадров в секунду (FPS) Вмешательство в регулирование

FPS Throttling Intervention позволяет играм работать с соответствующим FPS, используя только изменения на стороне платформы и не требуя каких-либо действий со стороны разработчиков.

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

GameManagerService

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

SurfaceFlinger

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

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

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

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

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

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