Hardware Composer (HWC) HAL определяет наиболее эффективный способ компоновки буферов с доступным оборудованием. Как HAL, его реализация зависит от устройства и обычно выполняется OEM-производителем оборудования дисплея.
Ценность этого подхода легко распознать, если рассмотреть плоскости наложения , которые объединяют несколько буферов в аппаратном обеспечении дисплея, а не в графическом процессоре. Например, рассмотрим типичный телефон Android в портретной ориентации со строкой состояния наверху, панелью навигации внизу и содержимым приложения везде в остальном. Содержимое для каждого слоя находится в отдельных буферах. Вы можете управлять композицией, используя любой из следующих методов:
- Отображение содержимого приложения в буфере данных, затем отображение строки состояния поверх него, панели навигации поверх нее и, наконец, передача буфера данных на устройство отображения.
- Передача всех трех буферов на дисплейное оборудование и указание ему считывать данные из разных буферов для разных частей экрана.
Последний подход может оказаться значительно более эффективным.
Возможности процессора отображения значительно различаются. Количество наложений, возможность вращения или смешивания слоев, а также ограничения на позиционирование и перекрытие могут быть трудно выражены через API. Чтобы учесть эти параметры, HWC выполняет следующие вычисления:
- SurfaceFlinger предоставляет HWC полный список слоев и спрашивает: «Как вы хотите с этим справиться?»
- HWC отвечает, помечая каждый слой как состав устройства или клиента.
- SurfaceFlinger заботится о каждом клиенте, передавая выходной буфер в HWC и позволяя HWC обрабатывать все остальное.
Поскольку поставщики оборудования могут индивидуально настраивать код принятия решений, можно добиться максимальной производительности от каждого устройства.
Плоскости наложения могут быть менее эффективны, чем композиция GL, когда на экране ничего не меняется. Это особенно верно, когда содержимое наложения имеет прозрачные пиксели, а перекрывающиеся слои смешиваются. В таких случаях HWC может запросить композицию GLES для некоторых или всех слоев и сохранить составленный буфер. Если SurfaceFlinger запрашивает составление того же набора буферов, HWC может показать ранее составленный буфер скретча. Это может улучшить срок службы батареи неактивного устройства.
Устройства Android обычно поддерживают четыре плоскости наложения. Попытка скомпоновать больше слоев, чем наложений, приводит к тому, что система использует композицию GLES для некоторых из них, что означает, что количество слоев, используемых приложением, может иметь измеримое влияние на энергопотребление и производительность.