SurfaceFlinger и WindowManager

SurfaceFlinger принимает буферы, формирует буферы и отправляет буферы на дисплей. WindowManager предоставляет 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 .