Адаптивная частота обновления

В Android 15 появилась функция адаптивной частоты обновления (ARR), которая позволяет частоте обновления экрана подстраиваться под частоту кадров контента с помощью дискретных шагов VSync.

Функция ARR дает следующие преимущества:

  • Снижение энергопотребления. По умолчанию ARR позволяет устройствам работать с частотой обновления ниже максимальной, переходя на более высокую частоту только тогда, когда это необходимо для удобства пользователя. Это сводит к минимуму ненужное энергопотребление.
  • Устранение рывков. ARR устраняет необходимость переключать режимы, что является известной причиной рывков.

Обзор

На панелях без адаптивной частоты обновления дисплей обновляется с фиксированной частотой, которая определяется активным режимом.

На панелях с адаптивной частотой обновления частота вертикальной синхронизации и частота обновления не связаны, что позволяет менять частоту обновления в рамках одного режима отображения в зависимости от частоты обновления контента. Панели могут работать с частотой обновления, которая является делителем эффекта разрыва изображения (TE). Производители устройств могут реализовать ARR с учетом своих предпочтений в отношении энергопотребления.

На рисунке ниже показан дисплей с частотой обновления vsyncPeriod 240 Гц и максимальной частотой обновления minFrameIntervalNs 120 Гц. Синхронизация VSync происходит каждые 4,16 мс. Кадр может быть представлен в любой момент времени, кратный VSync, после minFrameIntervalNs с момента последнего кадра.

arr-example

Рисунок 1. Пример ARR

Реализация

Android 15 поддерживает ARR с новыми API HAL Hardware Composer (HWC) и изменениями платформы. Чтобы включить ARR, производители оригинального оборудования должны поддерживать изменения ядра и системы на устройствах с Android 15 и более поздними версиями, а также реализовать версию 3 API android.hardware.graphics.composer3, как описано в следующих разделах.

Подробнее о реализации API, поддерживающих ARR, на устройствах Pixel…

DisplayConfiguration.aidl

В API DisplayConfiguration.aidl конфигурация экрана задается с помощью атрибутов экрана, а также следующих атрибутов для ARR:

  • Необязательный параметр vrrConfig. Если он задан, то ARR включается для определенных конфигураций. Если задано значение null, режим отображения будет установлен на режимы без автоматической регулировки частоты обновления, например несколько частот обновления (MRR). С помощью этого атрибута можно настроить показ как MRR или ARR, но не оба варианта одновременно.
  • vsyncPeriod: Частота вертикальной синхронизации дисплея. На дисплеях с адаптивной частотой обновления это значение используется для определения поддерживаемых дискретных частот обновления.

    Поставщики должны задавать значение DisplayConfiguration.vsyncPeriod для всех устройств. Для экранов без автоматической регулировки частоты обновления DisplayConfiguration.vsyncPeriod – это частота обновления экрана. Если устройство поддерживает частоту 120 Гц, то это значение должно быть равно 8,3 мс.

    Для дисплеев с ARR DisplayConfiguration.vsyncPeriod – это частота сигнала TE. Если у устройства minFrameIntervalNs составляет 8,3 мс, а TE – 240 Гц, то значение должно быть 4,16 мс.

VrrConfig.aidl

API VrrConfig.aidl включает следующие атрибуты:

  • minFrameIntervalNs: Максимальная частота обновления, поддерживаемая дисплеем.
  • NotifyExpectedPresentConfig – определяется тем, когда дисплею требуется предварительное уведомление о предстоящем кадре.

IComposerClient.notifyExpectedPresent предоставляет подсказку для кадра, который, скорее всего, будет показан, чтобы дисплей мог соответствующим образом адаптировать период самообновления. frameIntervalNs – текущая периодичность, которая следует за expectedPresentTime. Например, если функция notifyExpectedPresent вызывается с параметром expectedPresentTime N и значением frameIntervalNs 16,6 мс, то следующий кадр будет показан через N + 16,6 мс после текущего времени N. После момента времени N частота кадров составляет 16, 6 мс до следующих изменений.

IComposerClient.notifyExpectedPresent вызывается только в том случае, если задано значение DisplayConfiguration.notifyExpectedPresentConfig, и если выполняется одно из следующих условий:

  • Несоответствие текущего времени: ожидаемое время показа следующего кадра не соответствует обычной частоте обновления экрана, заданной параметром frameIntervalNs.
  • Превышено время ожидания: интервал между предыдущими кадрами больше или равен notifyExpectedPresentConfig.timeoutNs.

DisplayCommand.frameIntervalNs

DisplayCommand.frameIntervalNs – подсказка о частоте кадров в наносекундах.

Тестирование

Используйте onRefreshRateChangedDebug для отладки. Этот метод уведомляет клиента о том, что частота обновления экрана изменилась.

Используйте тестовое приложение для ручного тестирования, как показано на рисунке 2: TouchLatency

touchlatency-app

Рисунок 2. Приложение TouchLatency test.

В тестовом приложении с помощью ползунка задайте долю отрисовки, которая будет равна частоте обновления экрана, деленной на разные числа. Посмотрите, как меняется частота кадров в зависимости от запрошенной частоты.