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
.