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 del dispositivo e in genere viene eseguita dall'OEM dell'hardware del display.
Il valore di questo approccio è facile da riconoscere se si considerano i piani di sovrapposizione , che compongono più buffer nell'hardware del display anziché nella GPU. Ad esempio, considera un tipico telefono Android con orientamento verticale, con la barra di stato in alto, la barra di navigazione in basso e il contenuto dell'app ovunque. I contenuti di ciascun livello si trovano in buffer separati. Puoi gestire la composizione utilizzando uno dei seguenti metodi:
- Esegue il rendering del contenuto dell'app in un buffer di lavoro, quindi esegue il rendering della barra di stato su di esso, la barra di navigazione sopra e infine passa il buffer di lavoro all'hardware del display.
- Passando tutti e tre i buffer all'hardware del display e istruendolo a leggere i dati da buffer diversi per parti diverse dello schermo.
Quest’ultimo approccio può essere significativamente più efficiente.
Le capacità del processore del display variano in modo significativo. Il numero di sovrapposizioni, la possibilità di ruotare o unire i livelli e le restrizioni sul posizionamento e sulla sovrapposizione possono essere difficili da esprimere tramite un'API. Per soddisfare queste opzioni, l'HWC esegue i seguenti calcoli:
- SurfaceFlinger fornisce a HWC un elenco completo di livelli e chiede: "Come vuoi gestirlo?"
- HWC risponde contrassegnando ogni livello come composizione dispositivo o client.
- SurfaceFlinger si prende cura di qualsiasi client, passando il buffer di output a HWC e lascia che HWC gestisca il resto.
Poiché i fornitori di hardware possono personalizzare il codice decisionale, è possibile ottenere le migliori prestazioni da ogni dispositivo.
I piani sovrapposti potrebbero essere meno efficienti della composizione GL quando non cambia nulla sullo schermo. Ciò è particolarmente vero quando i contenuti sovrapposti hanno pixel trasparenti e i livelli sovrapposti vengono fusi. In tali casi, l'HWC può richiedere la composizione GLES per alcuni o tutti gli strati e trattenere il buffer composito. Se SurfaceFlinger chiede di comporre lo stesso set di buffer, l'HWC può mostrare il buffer di lavoro precedentemente composto. Ciò può migliorare la durata della batteria di un dispositivo inattivo.
I dispositivi Android in genere supportano quattro piani sovrapposti. Il tentativo di comporre più livelli che sovrapposizioni fa sì che il sistema utilizzi la composizione GLES per alcuni di essi, il che significa che il numero di livelli utilizzati da un'app può avere un impatto misurabile sul consumo energetico e sulle prestazioni.