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 указывает, что экран можно обновить без разрывов. Когда 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.