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