SurfaceFlinger e WindowManager

SurfaceFlinger accetta buffer, compone buffer e invia buffer al display. WindowManager fornisce a SurfaceFlinger buffer e metadati della finestra, che SurfaceFlinger utilizza per comporre le superfici sul display.

SurfaceFlinger

SurfaceFlinger può accettare i buffer in due modi: tramite BufferQueue e SurfaceControl o tramite ASurfaceControl.

Un modo in cui SurfaceFlinger accetta i buffer è tramite BufferQueue e SurfaceControl. Quando un'applicazione viene in primo piano, richiede buffer da WindowManager . WindowManager richiede quindi un livello da SurfaceFlinger. Uno strato è una combinazione di una superficie , che contiene il BufferQueue, e un SurfaceControl , che contiene i metadati strato come la cornice del display. SurfaceFlinger crea il livello e lo invia a WindowManager. WindowManager invia quindi la superficie all'app, ma mantiene SurfaceControl per modificare l'aspetto dell'app sullo schermo.

Android 10 aggiunge ASurfaceControl, che è un altro modo in cui SurfaceFlinger può accettare i buffer. ASurfaceControl combina una superficie e un SurfaceControl in un unico pacchetto di transazione che viene inviato a SurfaceFlinger. Un ASurfaceControl è associato a un livello, che le app aggiornano tramite ASurfaceTransactions. Le app ottengono quindi informazioni su ASurfaceTransactions tramite callback che passano ASurfaceTransactionStats contenenti informazioni, ad esempio tempo di latch, tempi di acquisizione e così via.

La tabella seguente include maggiori dettagli su ASurfaceControl e sui componenti associati.

Componente Descrizione
AControllo superficie Avvolge SurfaceControl e consente a un'app di creare SurfaceControl che corrispondono ai livelli sul display.

Può essere creato come figlio di ANativeWindow o come figlio di un altro ASurfaceControl.
ATransazione di superficie Wraps Transaction per consentire al client di modificare le proprietà descrittive di un layer, come la geometria, e invia i buffer aggiornati a SurfaceFlinger.
Statistiche delle transazioni di superficie Invia informazioni sulle transazioni che sono state presentate, ad esempio il tempo di latch, i tempi di acquisizione e il limite di rilascio precedente, a un'app tramite un callback preregistrato.

Sebbene le app possano inviare buffer in qualsiasi momento, SurfaceFlinger si riattiva solo per accettare i buffer tra gli aggiornamenti del display, che possono variare a seconda del dispositivo. Ciò riduce al minimo l'utilizzo della memoria ed evita lo strappo visibile sullo schermo, che può verificarsi durante l'aggiornamento del display durante l'aggiornamento.

Quando il display è tra gli aggiornamenti, il dispositivo invia il segnale di VSYNC SurfaceFlinger. Il segnale VSYNC indica che il display può essere aggiornato senza strappi. Quando SurfaceFlinger riceve il segnale VSYNC, SurfaceFlinger scorre il suo elenco di livelli alla ricerca di nuovi buffer. Se SurfaceFlinger trova un nuovo buffer, SurfaceFlinger acquisisce il buffer; in caso contrario, SurfaceFlinger continua a utilizzare il buffer precedentemente acquisito. SurfaceFlinger deve sempre visualizzare qualcosa, quindi si blocca su un buffer. Se nessun buffer è mai stato inviato su un livello, il livello viene ignorato.

Dopo che SurfaceFlinger ha raccolto tutti i buffer per i livelli visibili, chiede all'Hardware Composer (HWC) come deve essere eseguita la composizione. Se l'HWC contrassegna il tipo di composizione del livello come composizione client, SurfaceFlinger compone tali livelli. Poi, SurfaceFlinger passa il buffer di uscita al HWC .

WindowManager

WindowManager controlla finestra oggetti, che sono contenitori per view oggetti. Gli oggetti finestra sono sempre supportati da oggetti superficie. WindowManager supervisiona i cicli di vita, gli eventi di input e focus, l'orientamento dello schermo, le transizioni, le animazioni, la posizione, le trasformazioni, l'ordine z e molti altri aspetti di una finestra. WindowManager invia tutti i metadati della finestra a SurfaceFlinger in modo che SurfaceFlinger possa utilizzare tali dati per comporre le superfici sul display.

Pre-rotazione

Molti overlay hardware non supportano la rotazione (e anche se lo fanno, costa potenza di elaborazione); la soluzione è trasformare il buffer prima che raggiunga SurfaceFlinger. Supporta Android un suggerimento di query ( NATIVE_WINDOW_TRANSFORM_HINT ) in ANativeWindow per rappresentare il più probabile trasformazione da applicare al buffer da SurfaceFlinger. I driver GL possono usare questo suggerimento per pre-trasformare il buffer prima che raggiunga SurfaceFlinger in modo che quando arriva il buffer, venga trasformato correttamente.

Ad esempio, quando si riceve un suggerimento per ruotare di 90 gradi, generare e applicare una matrice al buffer per evitare che esca dalla fine della pagina. Per risparmiare energia, esegui questa pre-rotazione. Per i dettagli, vedere ANativeWindow interfaccia definita nel system/core/include/system/window.h .