Оптимизируйте частоту кадров с помощью адаптивной частоты обновления.

Когда в Android запускается анимация, частота обновления дисплея часто увеличивается до максимальной, чтобы обеспечить плавность работы. Для небольших анимаций, таких как индикаторы выполнения и визуализаторы звука, такая высокая частота обновления не является необходимой и приводит к высокому энергопотреблению.

Начиная с Android 15, благодаря функции адаптивной частоты обновления (ARR) включенные устройства могут уменьшать постоянное пребывание с высокой частотой обновления по двум направлениям:

  • Благодаря новой оптимизации управления частотой кадров на платформе приложения могут рендериться с более низкой частотой кадров по умолчанию и повышаться до высокой частоты только при необходимости.
  • Частота обновления дисплея динамически соответствует скорости рендеринга контента без рывков.

Хотя большинство приложений должны использовать ARR без каких-либо изменений, вы также можете при необходимости переопределить поведение частоты кадров по умолчанию.

На этой странице описано следующее:

  • Как определяется частота кадров каждого представления.
  • Общая политика того, как ARR определяет установленную частоту кадров.
  • Как вручную изменить поведение частоты кадров по умолчанию.

Механизм голосования за просмотр

В системе представлений Android каждое представление в иерархии пользовательского интерфейса может выражать предпочтительную частоту кадров. Эти предпочтения собираются и объединяются для определения окончательной частоты кадров для каждого кадра. Это достигается с помощью механизма голосования, в котором каждое представление голосует на основе своего атрибута частоты кадров, который может быть категорией или определенной частотой. Представления обычно голосуют при рисовании или обновлении. Эти голоса объединяются для определения окончательной частоты кадров, которая затем отправляется на уровень нижнего уровня в качестве подсказки для рендеринга.

В настоящее время в большинстве представлений по умолчанию используется «Нормальная» частота кадров, которая часто устанавливается на 60 Гц. Для более высокой частоты кадров вы можете использовать специальные API для настройки предпочтений, при этом система обычно выбирает самую высокую частоту кадров. Дополнительные сведения об использовании этих API см. в разделе «Установка частоты кадров или категории» . Общие политики в отношении частоты кадров описаны в разделе «Общая политика ARR» .

Категории частоты кадров

В классе View существуют разные категории частоты кадров, которые можно использовать при голосовании. Описание каждой категории следующее:

  • REQUESTED_FRAME_RATE_CATEGORY_DEFAULT : это значение можно установить для возврата к поведению по умолчанию, указывающему, что в этом представлении нет данных о частоте кадров.
  • REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE : представление не будет явно влиять на частоту кадров. Это означает, что даже если представление активно, платформа не будет учитывать его при определении частоты кадров.
  • REQUESTED_FRAME_RATE_CATEGORY_NORMAL : указывает среднюю частоту кадров, подходящую для анимации, которая не требует более высокой частоты кадров или не получает преимущества от высокой плавности. Обычно это 60 Гц или около того.
  • REQUESTED_FRAME_RATE_CATEGORY_HIGH : указывает частоту кадров, подходящую для анимации, требующей высокой частоты кадров, что может повысить плавность, но также может увеличить энергопотребление.

Представление голосует только в том случае, если оно требует перерисовки. Окончательная частота кадров определяется наибольшим количеством голосов. Например, если все голоса проголосовали за «Нормальный», выбирается «Нормальный». Когда происходит голосование как «Нормальное», так и «Высокое», выбирается «Высокое».

Частота кадров

Помимо категорий частоты кадров, в представлении также можно указать предпочтительную частоту кадров, например 30, 60 или 120 Гц. При голосовании за несколько частот кадров окончательная частота кадров определяется по следующим правилам:

  • Кратные друг другу : если проголосованные частоты кадров кратны друг другу, выбирается наибольшее значение. Например, если есть два голоса — 30 Гц и 90 Гц — в качестве конечной частоты кадров выбирается 90 Гц.
  • Не кратные друг другу :
    • Если какой-либо из голосов превышает 60 Гц, он считается «высоким» голосом.
    • Если все голоса имеют частоту 60 Гц или ниже, это считается «нормальным» голосом.

Кроме того, если существует комбинация значений частоты кадров и категорий частоты кадров, более высокое значение обычно определяет окончательную скорость рендеринга. Например, при сочетании голосования 60 Гц и голосования «Высокий» или голосования 120 Гц и голосования «Нормально» частота рендеринга обычно устанавливается на 120 Гц.

Помимо голосов из приложения, на уровень нижнего уровня могут отправляться и другие подсказки от разных компонентов в одном кадре. Многие из них могут возникать из компонентов системного пользовательского интерфейса, таких как панель уведомлений, строка состояния, панель навигации и другие. Окончательные значения частоты кадров определяются на основе голосов нескольких компонентов.

Установите частоту кадров или категорию

При определенных обстоятельствах у вас может быть предпочтительная частота кадров для просмотра. Например, вы можете установить для представления предпочтительную частоту кадров «Высокая», чтобы увеличить частоту кадров, если анимация выглядит негладкой. Кроме того, если в видео присутствует медленная или статичная анимация (обычно воспроизводимая с частотой 24 или 30 Гц), вы можете предпочесть, чтобы анимация запускалась со скоростью ниже «Нормальной», чтобы снизить энергопотребление.

Вы можете использовать API-интерфейсы setRequestedFrameRate() и getRequestedFrameRate() чтобы указать предпочтительную частоту кадров или категорию данного представления.

Котлин

// Set the preferred frame rate category to a View

// set the frame rate category to NORMAL
view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL
// set the frame rate category to HIGH
view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_HIGH
// reset the frame rate category
view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_DEFAULT

// Set the preferred frame rate to a View

// set the frame rate to 30
view.requestedFrameRate = 30f
// set the frame rate to 60
view.requestedFrameRate = 60f
// set the frame rate to 120
view.requestedFrameRate = 120f

Ява

// Set the preferred frame rate category to a View

// set the frame rate category to NORMAL
view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL);
// set the frame rate category to HIGH
view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_HIGH);
// reset the frame rate category
view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_DEFAULT);

// Set the preferred frame rate to a View

// set the frame rate to 30
view.setRequestedFrameRate(30);
// set the frame rate to 60
view.setRequestedFrameRate(60);
// set the frame rate to 120
view.setRequestedFrameRate(120);

Пример использования см. в TextureView .

Общая политика ARR

В предыдущем разделе мы обсуждали, что большинство анимаций по умолчанию отображаются с частотой 60 Гц, поскольку в каждом представлении в качестве предпочтительной частоты кадров установлено значение «Нормальная». Однако есть исключения, когда частота кадров увеличивается до «Высокого», чтобы обеспечить более плавную анимацию.

Общая политика ARR заключается в следующем:

  • Усиление касания : при обнаружении события касания ( MotionEvent.ACTION_DOWN ) частота обновления повышается до «Высокого» на некоторое время после отпускания касания, чтобы сохранить отзывчивость.
  • Жесты броска : жесты броска обрабатываются по-другому — частота обновления постепенно уменьшается по мере замедления скорости броска. Подробности об этом поведении можно найти в разделе «Улучшение прокрутки» .
  • Запуск приложений и переходы окон . Частота обновления также увеличивается на некоторое время во время запуска приложений, инициализации окон и переходов окон, чтобы обеспечить плавное визуальное восприятие.
  • Анимации . Анимации, включающие изменение движения или размера, автоматически получают более высокую частоту обновления для повышения плавности при изменении положения или размера представления.
  • SurfaceView и TextureView : частота кадров , явно установленная для TextureView и SurfaceView учитывается и применяется соответствующим образом.

Включение и отключение сенсорного усиления

Вы можете включить и/или отключить усиление сенсорного экрана на уровне Window . По умолчанию, когда пользователь касается экрана и отрывает его, скорость рендеринга на некоторое время увеличивается. API-интерфейсы setFrameRateBoostOnTouchEnabled() и getFrameRateBoostOnTouchEnabled() позволяют предотвратить увеличение скорости рендеринга при касании определенного Window .

Котлин

// disable touch boost on a Window
window.isFrameRateBoostOnTouchEnabled = false 
// enable touch boost on a Window
window.isFrameRateBoostOnTouchEnabled = true
// check if touch boost is enabled on a Window
val isTouchBoostEnabled = window.isFrameRateBoostOnTouchEnabled

Ява

// disable touch boost on a Window
window.setFrameRateBoostOnTouchEnabled(false)
// enable touch boost on a Window
window.setFrameRateBoostOnTouchEnabled(true)
// check if touch boost is enabled on a Window
window.getFrameRateBoostOnTouchEnabled()

Улучшение прокрутки

Одним из ключевых вариантов использования динамической оптимизации частоты кадров является улучшение качества прокрутки (прокрутки). Многие приложения в значительной степени полагаются на то, что пользователи проводят пальцем вверх для просмотра нового контента. Улучшение прокрутки ARR динамически регулирует частоту обновления по мере замедления жеста перемещения, постепенно снижая частоту кадров. Это обеспечивает более эффективный рендеринг при сохранении плавной прокрутки.

Это улучшение относится конкретно к прокручиваемым компонентам пользовательского интерфейса, включая ScrollView , ListView и GridView , и может быть доступно не для всех пользовательских реализаций.

Функция прокрутки ARR доступна для RecyclerView и NestedScrollView . Чтобы включить эту функцию в своем приложении, обновите AndroidX.recyclerview и AndroidX.core до последних версий. Подробности смотрите в следующей таблице.

Библиотека

Версия

AndroidX.recyclerview

1.4.0

AndroidX.core

1.15.0

Установите информацию о скорости

Если у вас есть собственный компонент с возможностью прокрутки и вы хотите воспользоваться функцией прокрутки, вызывайте setFrameContentVelocity() для каждого кадра при плавной прокрутке или перелистывании. Пример см. в следующем фрагменте кода:

Котлин

// set the velocity to a View (1000 pixels/Second)
view.frameContentVelocity = 1000f
// get the velocity of a View
val velocity = view.frameContentVelocity

Ява

// set the velocity to a View
view.setFrameContentVelocity(velocity);

// get the velocity of a View
final float velocity = view.getFrameContentVelocity()

Дополнительные примеры см. в RecyclerView и ScrollView . Чтобы правильно задать скорость, рассчитайте скорость контента (пикселей в секунду) вручную, если необходимую информацию невозможно получить с помощью Scroller или OverScroller .

Обратите внимание: если setFrameContentVelocity() и getFrameContentVelocity() вызываются для представлений, которые не являются прокручиваемыми компонентами, они не окажут никакого эффекта, поскольку движение автоматически вызывает увеличение частоты кадров в зависимости от текущей политики.

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

Включить и отключить ARR

ARR включен по умолчанию для повышения энергоэффективности. Хотя вы можете отключить эту функцию, это не рекомендуется, поскольку приложение будет потреблять больше энергии. Рассмотрите возможность отключения этой функции только в том случае, если вы столкнулись с проблемами, которые существенно влияют на взаимодействие с пользователем.

Чтобы включить или отключить ARR, используйте API setFrameRatePowerSavingsBalanced() в Window или используйте API isFrameRatePowerSavingsBalanced() через styles.xml .

В следующем фрагменте показано, как включить или отключить ARR в Window :

Котлин

// disable ARR on a Window
window.isFrameRatePowerSavingsBalanced = false 
// enable ARR on a Window
window.isFrameRatePowerSavingsBalanced = true  
// check if ARR is enabled on a Window
val isAdaptiveRefreshRateEnabled = window.isFrameRatePowerSavingsBalanced

Ява

// disable ARR on a Window
window.setFrameRatePowerSavingsBalanced(false)
// enable ARR on a Window
window.setFrameRatePowerSavingsBalanced(true)
// check if ARR is enabled on a Window
window.isFrameRatePowerSavingsBalanced()

Чтобы отключить ARR через styles.xml , добавьте следующий элемент в свой стиль в res/values/styles.xml :

<style name="frameRatePowerSavingsBalancedDisabled">
    <item name="android:windowIsFrameRatePowerSavingsBalanced">false</item>
</style>