SurfaceFlinger и WindowManager

SurfaceFlinger принимает, формирует и отправляет буферы на дисплей. WindowManager предоставляет SurfaceFlinger буферы и метаданные окна, которые SurfaceFlinger затем использует для формирования поверхностей на дисплее.

SurfaceFlinger

SurfaceFlinger может принимать буферы двумя способами: через BufferQueue и SurfaceControl или через ASurfaceControl .

Один из способов, которым SurfaceFlinger принимает буферы, — это использование BufferQueue и SurfaceControl . Когда приложение переходит на передний план, оно запрашивает буферы у WindowManager . Затем WindowManager запрашивает слой у SurfaceFlinger. Слой представляет собой комбинацию поверхности , содержащей BufferQueue, и экземпляра SurfaceControl , содержащего метаданные слоя, такие как рамка дисплея. SurfaceFlinger создает слой и отправляет его в WindowManager . Затем WindowManager отправляет поверхность приложению, но сохраняет экземпляр SurfaceControl для управления внешним видом приложения на экране.

Начиная с Android 10, ASurfaceControl предоставляет SurfaceFlinger еще один способ приема буферов. ASurfaceControl объединяет поверхность и экземпляр SurfaceControl в один пакет транзакции, который получает SurfaceFlinger. ASurfaceControl связан со слоем, который приложения обновляют через экземпляры ASurfaceTransaction . Затем приложения получают информацию об экземплярах ASurfaceTransaction через обратные вызовы, которые передают ASurfaceTransactionStats , содержащие информацию, такую ​​как время блокировки, время получения данных и т. д.

В таблице ниже описана ASurfaceControl и связанные с ней компоненты:

Компонент Описание
ASurfaceControl Этот модуль является оберткой SurfaceControl и позволяет приложению создавать экземпляры SurfaceControl , соответствующие слоям на дисплее.
Может быть создан как дочерний элемент ANativeWindow или как дочерний элемент другого экземпляра ASurfaceControl .
ASurfaceTransaction Transaction позволяет клиенту редактировать описательные свойства слоя, такие как геометрия, и отправляет обновленные буферы в SurfaceFlinger.
ASurfaceTransactionStats Отправляет в приложение информацию о представленных транзакциях, такую ​​как время блокировки, время получения и предыдущая граница выпуска, через предварительно зарегистрированный обратный вызов.

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

Когда дисплей находится между обновлениями, он отправляет сигнал VSync в SurfaceFlinger. Сигнал VSync указывает на возможность обновления дисплея без разрывов изображения. Получив сигнал VSync, SurfaceFlinger проходит по списку своих слоев в поисках новых буферов. Если он находит новый буфер, SurfaceFlinger захватывает его; в противном случае он продолжает использовать ранее захваченный буфер. SurfaceFlinger всегда должен что-то отображать, поэтому он использует один буфер. Если для слоя никогда не отправлялись буферы, SurfaceFlinger игнорирует этот слой.

После того как SurfaceFlinger соберет все буферы для видимых слоев, он запрашивает у аппаратного компоновщика (HWC) способ композиции. Если HWC помечает тип композиции слоев как «композиция клиента», SurfaceFlinger компонует эти слои. Затем SurfaceFlinger передает выходной буфер в HWC .

Менеджер окон

WindowManager управляет объектами Window , которые являются контейнерами для объектов View . Объекты Window всегда поддерживаются объектами Surface . WindowManager контролирует жизненные циклы, события ввода и фокусировки, ориентацию экрана, переходы, анимацию, положение, преобразования, порядок отображения (z-order) и многие другие аспекты окна. WindowManager отправляет все метаданные окна в SurfaceFlinger, чтобы SurfaceFlinger мог использовать эти данные для компоновки поверхностей на дисплее.

Предварительное вращение

Многие аппаратные наложения не поддерживают вращение (а даже если поддерживают, это требует вычислительной мощности); решение состоит в преобразовании буфера до того, как он достигнет SurfaceFlinger. Android поддерживает подсказку запроса ( NATIVE_WINDOW_TRANSFORM_HINT ) в ANativeWindow которая представляет наиболее вероятное преобразование, которое SurfaceFlinger применит к буферу. Драйверы GL могут использовать эту подсказку для предварительного преобразования буфера до того, как он достигнет SurfaceFlinger, чтобы при поступлении буфер был преобразован правильно.

Например, при получении подсказки о повороте на 90 градусов, сгенерируйте и примените матрицу к буферу, чтобы предотвратить его выход за пределы страницы. Для экономии энергии выполните это предварительное вращение. Подробности см. в интерфейсе ANativeWindow , определенном в system/core/include/system/window.h .