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
связан со слоем, который приложения обновляют через экземпляры ASurfaceTransaction
. Затем приложения получают информацию об экземплярах ASurfaceTransaction
через обратные вызовы, которые передают ASurfaceTransactionStats
, содержащий такие данные, как время фиксации, время получения и так далее.
В следующей таблице приведены более подробные сведения об ASurfaceControl
и связанных с ним компонентах:
Компонент | Описание |
---|---|
ASurfaceControl | Создает оболочку SurfaceControl и позволяет приложению создавать экземпляры SurfaceControl , соответствующие слоям на дисплее.Может быть создан как дочерний элемент ANativeWindow или как дочерний элемент другого экземпляра ASurfaceControl . |
ASurfaceTransaction | Обертывает Transaction , позволяя клиенту редактировать описательные свойства слоя, такие как геометрия, и отправляет обновленные буферы в SurfaceFlinger. |
ASurfaceTransactionStats Отправляет информацию о представленных транзакциях, например, время фиксации, время получения и предыдущую границу выпуска, в приложение через предварительно зарегистрированный обратный вызов. |
Хотя приложения могут отправлять буферы в любое время, SurfaceFlinger выходит из спящего режима только для приёма буферов между обновлениями экрана, которые могут различаться в зависимости от устройства. Это минимизирует использование памяти и предотвращает видимые разрывы на экране, которые могут возникать при обновлении экрана в середине обновления.
Когда дисплей находится между обновлениями, он отправляет сигнал VSync в SurfaceFlinger. Сигнал VSync указывает на возможность обновления экрана без разрывов. Когда SurfaceFlinger получает сигнал VSync, SurfaceFlinger просматривает список слоёв в поисках новых буферов. Если SurfaceFlinger находит новый буфер, он его получает; если нет, SurfaceFlinger продолжает использовать ранее полученный буфер. SurfaceFlinger всегда должен что-то отображать, поэтому он использует один буфер. Если для слоя не было отправлено ни одного буфера, этот слой игнорируется.
После того, как SurfaceFlinger собрал все буферы для видимых слоёв, он запрашивает у аппаратного компоновщика (HWC) способ выполнения композиции. Если HWC указывает тип композиции слоёв как клиентскую композицию, SurfaceFlinger выполняет композицию этих слоёв. Затем SurfaceFlinger передаёт выходной буфер в HWC .
Менеджер окон
WindowManager
управляет объектами Window
, которые являются контейнерами для объектов View
. Объекты Window
всегда поддерживаются объектами Surface
. WindowManager
контролирует жизненные циклы, события ввода и фокуса, ориентацию экрана, переходы, анимацию, положение, преобразования, z-порядок и многие другие аспекты окна. WindowManager
отправляет все метаданные окна в SurfaceFlinger, чтобы SurfaceFlinger мог использовать эти данные для создания композитных поверхностей на дисплее.
Предварительная ротация
Многие аппаратные оверлеи не поддерживают поворот (и даже если поддерживают, это требует затрат вычислительной мощности); решение заключается в преобразовании буфера до того, как он достигнет SurfaceFlinger. Android поддерживает подсказку запроса ( NATIVE_WINDOW_TRANSFORM_HINT
) в ANativeWindow
для представления наиболее вероятного преобразования, которое SurfaceFlinger применит к буферу. Драйверы GL могут использовать эту подсказку для предварительного преобразования буфера до того, как он достигнет SurfaceFlinger, чтобы по прибытии буфер был преобразован правильно.
Например, при получении подсказки повернуть на 90 градусов сгенерировать и применить к буферу матрицу, чтобы предотвратить выход за пределы страницы. Для экономии энергии выполняйте этот предварительный поворот. Подробнее см. в описании интерфейса ANativeWindow
, определённого в system/core/include/system/window.h
.