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 и связанных с ним компонентах.
Компонент | Описание |
---|---|
ASurfaceControl | Создает оболочку для SurfaceControl и позволяет приложению создавать элементы SurfaceControl, соответствующие слоям на дисплее. Может быть создан как дочерний элемент ANativeWindow или как дочерний элемент другого ASurfaceControl. |
ASurfaceTransaction | Оборачивает транзакцию, позволяя клиенту редактировать описательные свойства слоя, такие как геометрия, и отправляет обновленные буферы в SurfaceFlinger. |
ASurfaceTransactionStats | Отправляет информацию о представленных транзакциях, например, время фиксации, время получения и предыдущую границу выпуска, в приложение через предварительно зарегистрированный обратный вызов. |
Хотя приложения могут отправлять буферы в любое время, SurfaceFlinger просыпается только для приема буферов между обновлениями дисплея, которые могут различаться в зависимости от устройства. Это минимизирует использование памяти и позволяет избежать видимых разрывов на экране, которые могут возникнуть при обновлении дисплея в середине обновления.
Когда дисплей находится между обновлениями, дисплей отправляет сигнал VSYNC в SurfaceFlinger. Сигнал VSYNC указывает, что дисплей может быть обновлен без разрывов. Когда SurfaceFlinger получает сигнал VSYNC, SurfaceFlinger проходит по своему списку слоев в поисках новых буферов. Если SurfaceFlinger находит новый буфер, SurfaceFlinger получает буфер; если нет, SurfaceFlinger продолжает использовать ранее полученный буфер. SurfaceFlinger всегда должен что-то отображать, поэтому он зависает на одном буфере. Если на слое никогда не было отправлено ни одного буфера, слой игнорируется.
После того, как SurfaceFlinger собрал все буферы для видимых слоев, он спрашивает Hardware Composer (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
.