Google 致力于为黑人社区推动种族平等。查看具体举措
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

SurfaceFlinger e WindowManager

SurfaceFlinger accetta i buffer, compone i buffer e invia i 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'app arriva in primo piano, richiede buffer da WindowManager . WindowManager richiede quindi un livello da SurfaceFlinger. Un livello è una combinazione di una superficie , che contiene BufferQueue, e un SurfaceControl , che contiene i metadati del livello come la cornice di visualizzazione. SurfaceFlinger crea il livello e lo invia a WindowManager. WindowManager invia quindi la superficie all'app, ma mantiene SurfaceControl per manipolare 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 transazioni 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, come il tempo di latch, i tempi di acquisizione e così via.

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

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

Può essere creato come figlio di ANativeWindow o come figlio di un altro ASurfaceControl.
ASurfaceTransaction Esegue il wrapping della transazione per consentire al client di modificare le proprietà descrittive di un layer, come la geometria, e invia i buffer aggiornati a SurfaceFlinger.
ASurfaceTransactionStats Invia le informazioni sulle transazioni che sono state presentate, come il tempo di latch, i tempi di acquisizione e il limite di rilascio precedente, a un'app tramite una richiamata preregistrata.

Sebbene le app possano inviare buffer in qualsiasi momento, SurfaceFlinger si riattiva solo per accettare 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 a metà aggiornamento.

Quando il display è tra gli aggiornamenti, il display invia il segnale VSYNC a SurfaceFlinger. Il segnale VSYNC indica che il display può essere aggiornato senza strappi. Quando SurfaceFlinger riceve il segnale VSYNC, SurfaceFlinger passa in rassegna 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 acquisito in precedenza. 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 a Hardware Composer (HWC) come eseguire la composizione. Se l'HWC contrassegna il tipo di composizione dei livelli come composizione client, SurfaceFlinger compone tali livelli. Quindi, SurfaceFlinger passa il buffer di output all'HWC .

WindowManager

WindowManager controlla gli oggetti finestra , che sono contenitori per gli oggetti di visualizzazione . Gli oggetti finestra sono sempre supportati da oggetti di 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 usare quei dati per comporre 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. Android supporta un suggerimento per la query ( NATIVE_WINDOW_TRANSFORM_HINT ) in ANativeWindow per rappresentare la trasformazione più probabile da applicare al buffer da SurfaceFlinger. I driver GL possono utilizzare questo suggerimento per pre-trasformare il buffer prima che raggiunga SurfaceFlinger in modo che quando arriva il buffer, viene trasformato correttamente.

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