← Назад к вопросам

Как система гарантирует частоту обновления экрана

2.0 Middle🔥 91 комментариев
#UI и вёрстка#Производительность и оптимизация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как система Android гарантирует частоту обновления экрана

В Android обеспечение стабильной частоты обновления экрана — это комплексный процесс, управляемый системными компонентами на нескольких уровнях, от драйверов до фреймворка приложений. Ключевым механизмом здесь является Vsync (Vertical Synchronization) и связанная с ним система Choreographer.

Роль Vsync и графической подсистемы

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

Архитектура отрисовки на основе Vsync (современная, начиная с Android 4.1 "Project Butter"):

  • Драйвер/Display HAL: Генерирует физический сигнал Vsync и передает его в систему.
  • SurfaceFlinger: Системный сервис, отвечающий за композицию (сборку) конечного кадра из слоев разных приложений. Он работает в соответствии с сигналами Vsync.
  • Choreographer: Ключевой компонент внутри каждого приложения (точнее, его UI Thread). Он получает сигналы Vsync от системы и координирует три основные фазы отрисовки UI: input (обработка ввода), animation (выполнение анимаций) и draw (отрисовка).

Choreographer и цикл отрисовки UI

Choreographer — это центральный "дирижер" отрисовки внутри приложения. Он гарантирует, что все операции, связанные с подготовкой кадра, выполняются строго в интервалах между сигналами Vsync, что обеспечивает частоту, соответствующую физической частоте экрана (например, 60Hz, 90Hz, 120Hz).

Ключевые этапы работы Choreographer:

  1. Регистрация Callbacks: Компоненты UI (например, View, анимации) регистрируют в Choreographer свои callback'ы на одну из трех фаз: INPUT, ANIMATION, TRAVERSAL (по сути, draw).
  2. Синхронизация с Vsync: Когда система получает сигнал Vsync, она отправляет его всем зарегистрированным Choreographer'ам через IPC.
  3. Выполнение зарегистрированных действий: В строго заданном порядке и в пределах одного Vsync интервала Choreographer выполняет:
    *   Callbacks фазы `INPUT` (обработка касаний и других событий ввода).
    *   Callbacks фазы `ANIMATION` (расчет следующего шага анимаций).
    *   Callbacks фазы `TRAVERSAL`. Это самый важный этап, который запускает **measure (измерение), layout (размещение) и draw (отрисовка)** дерева View. Именно здесь вызывается знаковый метод `View.onDraw()`.

// Пример регистрации callback для отрисовки в Choreographer (внутри View)
public void invalidate() {
    // Запрос на перерисовку приводит к пост-обработке, которая в конечном итоге
    // регистрирует callback типа TRAVERSAL в Choreographer для текущего фрейма.
    // Внутренняя реализация вызывает:
    // mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
}

Что происходит, если отрисовка не завершилась вовремя? Если система не успевает подготовить кадра до следующего сигнала Vsync, возникает jank (задержка, "тормоз"). Кадр либо пропускается (что снижает воспринимаемую частоту), либо отображается частично. Именно для борьбы с этим существуют инструменты профилирования, такие как Systrace и Profile GPU Rendering, которые показывают, сколько времени тратится на каждую фазу.

Поддержка переменной частоты обновления (VRR)

На современных устройствах с экранами, поддерживающими Variable Refresh Rate (VRR) или Adaptive Refresh Rate, система (в частности, SurfaceFlinger и драйвер) динамически может изменять частоту генерации сигналов Vsync. Например, в статичном контенте частота может снижаться до 1Hz для экономии энергии, а в игровом — повышаться до максимума (120Hz). Приложения могут запрашивать желаемую частоту через Window.setFrameRate().

Итог: Многоуровневая синхронизация

Таким образом, система гарантирует частоту обновления экрана через:

  • Физический/драйверный уровень: Генерация сигнала Vsync, определяющего базовый ритм.
  • Системный уровень: SurfaceFlinger выполняет композицию строго по этому ритму.
  • Уровень приложения: Choreographer в каждом приложении дисциплинирует всю работу UI Thread, разбивая ее на фазы и привязывая их выполнение к интервалам Vsync. Это создает жесткий, синхронизированный цикл отрисовки, который стремится соответствовать физическим возможностям экрана.
Как система гарантирует частоту обновления экрана | PrepBro