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 .