Файлы System/bin Android 12. Справочник.


  Все     Команда     Скрипт     Служба     Приложение  

surfaceflinger
Композитный менеджер графических слоёв (служба)

Тип файла: служба

   

Комментарии
Android SurfaceFlinger — это системная служба, предоставляемая в операционной системе Android.
Теперь, когда это исключено… Что это на самом деле делает?
Если вы работали со скроллингом, то знаете, что «прокрутка» — это действие, которое может выполнить пользователь, но оно не связано с ним.
Фактически, SurfaceFlinger — это сервис, который играет важную роль в определении того, что отображается на экране любого устройства Android.

Важно отметить, что SurfaceFlinger ничего не отображает напрямую на экране.
На самом деле все, что он делает, — это всего лишь составные буферы данных
перед их передачей в HAL.
С точки зрения непрофессионала — SurfaceFlinger принимает буферы отображаемых данных, объединяет их в один буфер, а затем передает его на уровень аппаратной абстракции.
HAL — это аббревиатура от Hardware Abstraction Layer.
Этот уровень устраняет разрыв между программным обеспечением,
работающим на Android, и фактическим оборудованием, отвечающим за работу операционной системы.

Буфер — это просто область памяти, выделенная для временного хранения чего-либо, пока оно перемещается в другое место.
Однако SurfaceFlinger работает только с буферами, содержащими графику
и отображаемые данные. Это та же идея, что и обычные буферы, за исключением того, что все данные, содержащиеся в них, используются для информирования о том, как должен отображаться экран.

Откуда SurfaceFlinger получает свои буферы?
В большинстве приложений Android SurfaceFlinger имеет доступ к трем различным буферам:
буфер для строки состояния,
буфер для панели навигации и
буфер для содержимого приложения.

----------------------------------
https://source.android.com/docs/core/graphics/surfaceflinger-windowmanager

SurfaceFlinger и WindowManager

SurfaceFlinger принимает буферы, составляет буферы и отправляет буферы на дисплей.
WindowManager предоставляет SurfaceFlinger буферы и метаданные окна,
которые SurfaceFlinger использует для соединения поверхностей с отображением.

SurfaceFlinger

SurfaceFlinger может принимать буферы двумя способами:
1) через BufferQueue и SurfaceControl
2) через ASurfaceControl

1. Cпособ, в котором которым SurfaceFlinger принимает буферы
через BufferQueue и SurfaceControl.

Когда приложение выходит на передний план, оно запрашивает буферы у WindowManager.
Затем WindowManager запрашивает слой у SurfaceFlinger.

Слой представляет собой комбинацию поверхности, которая содержит BufferQueue,
и SurfaceControl , которая содержит метаданные слоя, такие как кадр дисплея.

SurfaceFlinger создает слой и отправляет его в WindowManager.
Затем WindowManager отправляет поверхность в приложение,
но сохраняет SurfaceControl для управления внешним видом приложения на экране.

2. В 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 соберет все буферы для видимых слоев,
он запрашивает аппаратный компоновщик (HWC), как следует выполнять композицию.
Если HWC помечает тип композиции слоя как клиентскую композицию,
SurfaceFlinger объединяет эти слои. Затем SurfaceFlinger передает выходной буфер в HWC (Hardware Composer)

Составные слои HAL аппаратного компоновщика (HWC), полученные от SurfaceFlinger,
уменьшают количество композиций, выполняемых OpenGL ES (GLES) и графическим процессором.
HWC абстрагирует объекты, такие как наложения и 2D-блитеры, на составные
поверхности и взаимодействует со специализированным оборудованием для композиции
окон с составными окнами. HWC используется объединения окон вместо соединения
SurfaceFlinger с графическим процессором.

Большинство графических процессоров не оптимизированы для композиции, и когда
графический процессор компонует слои из SurfaceFlinger, приложения не могут
использовать графический процессор для собственного рендеринга.


WindowManager

WindowManager управляет объектами окна, которые являются контейнерами
для объектов представления. Оконные объекты всегда поддерживаются
поверхностными объектами.

WindowManager наблюдает за жизненными циклами, событиями ввода и фокуса,
ориентацией экрана, переходами, анимацией, положением, преобразованиями,
z-порядком и многими другими аспектами окна.

WindowManager отправляет все метаданные окна в SurfaceFlinger,
чтобы SurfaceFlinger мог использовать эти данные для составных поверхностей на дисплее.

Pre-rotation (предварительный поворот)

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

Android поддерживает подсказку запроса (NATIVE_WINDOW_TRANSFORM_HINT)
для представления ANativeWindow наиболее вероятного преобразования,
которое будет применено к буферу с помощью SurfaceFlinger.

Драйверы GL могут использовать эту подсказку для предварительного преобразования
буфера до того, как он достигнет SurfaceFlinger, чтобы при поступлении буфера
он правильно преобразовывался.

Например, при получении подсказки повернуть на 90 градусов сгенерирует и применит
матрицу к буферу, чтобы он не выходил за пределы страницы.
Сделает этот предварительный поворот для экономии энергии.