Аппаратный композитор HAL

Аппаратный компоновщик (HWC) определяет наиболее эффективный способ компоновки буферов с использованием доступного оборудования. Как и любой HAL, его реализация зависит от конкретного устройства и обычно выполняется производителем дисплейного оборудования.

Ценность такого подхода легко оценить, если рассмотреть наложенные плоскости , которые компонуют несколько буферов в аппаратном обеспечении дисплея, а не в графическом процессоре. Например, рассмотрим типичный телефон Android в портретной ориентации, с строкой состояния сверху, панелью навигации снизу и содержимым приложений во всех остальных местах. Содержимое каждого слоя находится в отдельных буферах. Компоновку можно осуществлять одним из следующих способов:

  • Отображение содержимого приложения в буфере временного хранения, затем отрисовка строки состояния поверх неё, панели навигации поверх неё и, наконец, передача буфера временного хранения аппаратному обеспечению дисплея.
  • Передача всех трех буферов аппаратному обеспечению дисплея и указание ему считывать данные из разных буферов для разных частей экрана.

Второй подход может быть значительно эффективнее.

Возможности графических процессоров значительно различаются. Количество наложений, возможность поворота или смешивания слоев, а также ограничения на позиционирование и перекрытие могут быть сложно выразить через API. Для учета этих параметров HWC выполняет следующие вычисления:

  1. SurfaceFlinger предоставляет HWC полный список слоев и спрашивает: «Как вы хотите это обработать?»
  2. В ответ HWC помечает каждый слой как состав устройства или клиента.
  3. SurfaceFlinger берет на себя обработку любого клиента, передавая буфер вывода в HWC, а HWC тем временем обрабатывает все остальное.

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

Использование плоскостей наложения может быть менее эффективным, чем композиция GL, когда на экране ничего не меняется. Это особенно актуально, когда содержимое наложения содержит прозрачные пиксели, а перекрывающиеся слои смешиваются. В таких случаях HWC может запросить композицию GLES для некоторых или всех слоев и сохранить скомпонованный буфер. Если SurfaceFlinger запросит композицию того же набора буферов, HWC может отобразить ранее скомпонованный буфер-заглушку. Это может увеличить время автономной работы устройства в режиме ожидания.

Устройства Android обычно поддерживают четыре плоскости наложения. Попытка компоновки большего количества слоев, чем слоев наложения, приводит к тому, что система использует композицию GLES для некоторых из них, а это значит, что количество слоев, используемых приложением, может оказывать ощутимое влияние на энергопотребление и производительность.