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 связан со слоем, который приложения обновляют через ASurfaceTransactions. Затем приложения получают информацию об ASurfaceTransactions через обратные вызовы, которые передают ASurfaceTransactionStats, содержащие информацию, такую ​​как время фиксации, время получения и т. д.

В следующей таблице приведены дополнительные сведения об ASurfaceControl и связанных с ним компонентах.

Компонент Описание
Поверхностный контроль Обертывает SurfaceControl и позволяет приложению создавать SurfaceControls, соответствующие слоям на дисплее.

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

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

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

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

оконный менеджер

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

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

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

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