Google стремится продвигать расовую справедливость для черных сообществ. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

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 Транзакция Wraps позволяет клиенту редактировать описательные свойства слоя, такие как геометрия, и отправляет обновленные буферы в 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 .