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 собрал все буферы для видимых слоёв, он запрашивает у аппаратного компоновщика (HWC) способ выполнения композиции. Если HWC указывает тип композиции слоёв как клиентскую композицию, SurfaceFlinger выполняет композицию этих слоёв. Затем SurfaceFlinger передаёт выходной буфер в HWC .

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

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

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

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

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