La HAL de Hardware Composer (HWC) determina la forma más eficiente de combinar búferes con el hardware disponible. Como HAL, su implementación es específica del dispositivo y, por lo general, la realiza el OEM de hardware de la pantalla.
El valor de este enfoque es fácil de reconocer cuando consideras los planos superpuestos, que combinan varios búferes en el hardware de la pantalla en lugar de la GPU. Por ejemplo, considera un teléfono Android típico en orientación vertical, con la barra de estado en la parte superior, la barra de navegación en la parte inferior y el contenido de la app en todas partes. El contenido de cada capa está en búferes independientes. Puedes controlar la composición con uno de los siguientes métodos:
- Renderiza el contenido de la app en un búfer de borrado en blanco, luego renderiza la barra de estado sobre él, la barra de navegación sobre esa, y, por último, pasa el búfer de borrado en blanco al hardware de la pantalla.
- Pasar los tres búferes al hardware de la pantalla y ordenarle que lea datos de diferentes búferes para diferentes partes de la pantalla.
El último enfoque puede ser mucho más eficiente.
Las capacidades del procesador de la pantalla varían considerablemente. La cantidad de superposiciones, si las capas se pueden rotar o combinar, y las restricciones de posicionamiento y superposición pueden ser difíciles de expresar a través de una API. Para admitir estas opciones, el HWC realiza los siguientes cálculos:
- SurfaceFlinger proporciona a HWC una lista completa de capas y pregunta: "¿Cómo quieres controlar esto?".
- HWC responde marcando cada capa como composición del dispositivo o del cliente.
- SurfaceFlinger se encarga de cualquier cliente, pasa el búfer de salida a HWC, y permite que HWC se encargue del resto.
Debido a que los proveedores de hardware pueden personalizar el código de toma de decisiones, es posible obtener el mejor rendimiento de cada dispositivo.
Los planos superpuestos pueden ser menos eficientes que la composición de GL cuando no cambia nada en la pantalla. Esto es especialmente cierto cuando el contenido superpuesto tiene píxeles transparentes y las capas superpuestas se combinan. En esos casos, el HWC puede solicitar la composición de GLES para algunas o todas las capas, y retener el búfer compuesto. Si SurfaceFlinger solicita combinar el mismo conjunto de búferes, el HWC puede mostrar el búfer de borrado compuesto anteriormente. Esto puede mejorar la duración de batería de un dispositivo inactivo.
Por lo general, los dispositivos Android admiten cuatro planos superpuestos. Si intentas combinar más capas que superposiciones, el sistema usará la composición de GLES para algunas de ellas, lo que significa que la cantidad de capas que usa una app puede tener un impacto medible en el consumo de energía y el rendimiento.