L'HAL Hardware Composer (HWC) determina il modo più efficiente per comporre i buffer con l'hardware disponibile. In quanto HAL, la sua implementazione è specifica per il dispositivo e di solito viene eseguita dall'OEM dell'hardware del display.
Il valore di questo approccio è facile da riconoscere se si considerano i piani di overlay, che compongono più buffer nell'hardware di visualizzazione anziché nella GPU. Ad esempio, considera un tipico smartphone Android in orientamento verticale, con la barra di stato in alto, la barra di navigazione in basso e i contenuti dell'app ovunque. I contenuti di ogni livello si trovano in buffer separati. Puoi gestire la composizione utilizzando uno dei seguenti metodi:
- Il rendering dei contenuti dell'app in un buffer temporaneo, quindi il rendering della barra di stato sopra, la barra di navigazione sopra e infine il passaggio del buffer temporaneo all'hardware del display.
- Passando tutti e tre i buffer all'hardware del display e chiedendogli di leggere i dati da buffer diversi per diverse parti dello schermo.
Quest'ultimo approccio può essere molto più efficiente.
Le funzionalità del processore del display variano in modo significativo. Il numero di overlay, la possibilità di ruotare o combinare i livelli e le limitazioni relative al posizionamento e alla sovrapposizione possono essere difficili da esprimere tramite un'API. Per adattarsi a queste opzioni, l'HWC esegue i seguenti calcoli:
- SurfaceFlinger fornisce a HWC un elenco completo di livelli e chiede: "Come vuoi gestire questa situazione?"
- HWC risponde contrassegnando ogni livello come composizione del dispositivo o del client.
- SurfaceFlinger si occupa di qualsiasi client, passando il buffer di output a HWC, che si occupa del resto.
Poiché i fornitori di hardware possono personalizzare il codice decisionale, è possibile ottenere le migliori prestazioni da ogni dispositivo.
I piani di overlay potrebbero essere meno efficienti della composizione GL quando nulla sullo schermo cambia. Ciò è particolarmente vero quando i contenuti in overlay hanno pixel trasparenti e i livelli sovrapposti vengono combinati. In questi casi, l'HWC può richiedere la composizione GLES per alcuni o tutti i livelli e conservare il buffer composito. Se SurfaceFlinger chiede di comporre lo stesso insieme di buffer, HWC può mostrare il buffer di scratch composto in precedenza. In questo modo, la durata della batteria di un dispositivo inattivo può essere migliorata.
I dispositivi Android in genere supportano quattro piani di overlay. Se si tenta di comporre più livelli di overlay, il sistema utilizza la composizione GLES per alcuni di questi, il che significa che il numero di livelli utilizzati da un'app può avere un impatto misurabile sul consumo energetico e sulle prestazioni.