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 и связанных с ним компонентах.

Составная часть Описание
ASurfaceControl Обертывает SurfaceControl и позволяет приложению создавать SurfaceControls, соответствующие слоям на дисплее.

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

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

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

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