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 указывает, что экран можно обновить без разрывов. Когда SurfaceFlinger получает сигнал VSync, он просматривает список слоев в поисках новых буферов. Если буфер найден, SurfaceFlinger получает его, а если нет – продолжает использовать ранее полученный буфер. SurfaceFlinger всегда должен что-то отображать, поэтому он удерживает один буфер. Если для слоя не было отправлено ни одного буфера, SurfaceFlinger игнорирует этот слой.
После того как SurfaceFlinger соберет все буферы для видимых слоев, он спросит у Hardware Composer (HWC), как выполнить композицию. Если HWC отмечает тип композиции слоя как композицию клиента, SurfaceFlinger выполняет композицию этих слоев. Затем SurfaceFlinger передает выходной буфер в HWC.
WindowManager
WindowManager управляет объектами Window, которые являются контейнерами для объектов View. Объекты Window всегда поддерживаются объектами Surface.
WindowManager отвечает за жизненные циклы, события ввода и фокуса, ориентацию экрана, переходы, анимацию, положение, преобразования, порядок наложения и многие другие аспекты окна. WindowManager отправляет все метаданные окна в SurfaceFlinger, чтобы SurfaceFlinger мог использовать эти данные для составления поверхностей на дисплее.
Предварительный поворот
Многие аппаратные наложения не поддерживают поворот (даже если поддерживают, это требует вычислительных ресурсов). Решение состоит в том, чтобы преобразовать буфер до того, как он достигнет SurfaceFlinger. Android поддерживает подсказку запроса (NATIVE_WINDOW_TRANSFORM_HINT) в ANativeWindow, которая представляет наиболее вероятное преобразование, которое SurfaceFlinger применит к буферу.
Драйверы GL могут использовать эту подсказку, чтобы предварительно преобразовать буфер, прежде чем он достигнет SurfaceFlinger. В результате буфер будет преобразован правильно.
Например, при получении подсказки повернуть изображение на 90 градусов создайте и примените матрицу к буферу, чтобы предотвратить выход изображения за пределы страницы. Чтобы сэкономить энергию, выполните следующие действия перед поворотом. Подробные сведения приведены в описании интерфейса ANativeWindow, определенного в system/core/include/system/window.h.