SurfaceFlinger accetta, compone e invia i buffer al display. WindowManager
fornisce a SurfaceFlinger buffer e metadati della finestra, che vengono utilizzati da SurfaceFlinger per comporre le piattaforme sul display.
SurfaceFlinger
SurfaceFlinger può accettare buffer in due modi: tramite BufferQueue e
SurfaceControl
oppure tramite ASurfaceControl
.
Un modo in cui SurfaceFlinger accetta i buffer è tramite BufferQueue e
SurfaceControl
. Quando un'app viene messa in primo piano, richiede buffer da
WindowManager
. WindowManager
richiede quindi un livello da
SurfaceFlinger. Un livello è una combinazione di una superficie, che contiene la BufferQueue, e un'istanza SurfaceControl
, che contiene i metadati del livello, come il frame di visualizzazione.
SurfaceFlinger crea il livello e lo invia a WindowManager
. WindowManager
quindi invia la superficie all'app, ma mantiene l'istanza SurfaceControl
per manipulare l'aspetto dell'app sullo schermo.
Android 10 aggiunge ASurfaceControl
, un altro modo in cui SurfaceFlinger può accettare i buffer. ASurfaceControl
combina una superficie
e un'istanza SurfaceControl
in un unico pacchetto di transazioni inviato a
SurfaceFlinger. ASurfaceControl
è associato a uno strato, che le app
aggiornano tramite istanze ASurfaceTransaction
. Le app ricevono quindi informazioni sulle istanze ASurfaceTransaction
tramite callback che trasmettono ASurfaceTransactionStats
contenenti informazioni, ad esempio tempo di aggancio, tempi di acquisizione e così via.
La tabella seguente include ulteriori dettagli su ASurfaceControl
e sui relativi componenti associati:
Componente | Descrizione |
---|---|
ASurfaceControl |
Avvolge SurfaceControl e consente a un'app di creare istanze SurfaceControl che
corrispondono ai livelli sul display.Può essere creato come elemento figlio di ANativeWindow o di un'altra istanza ASurfaceControl . |
ASurfaceTransaction |
Avvolge Transaction per consentire al client di modificare le proprietà descriptive di un livello, come la geometria, e invia i buffer aggiornati a SurfaceFlinger. |
ASurfaceTransactionStats
| Invia informazioni sulle transazioni che sono state presentate, ad esempio il tempo di blocco, i tempi di acquisizione e la recinzione di rilascio precedente, a un'app tramite un callback preregistrato. |
Sebbene le app possano inviare buffer in qualsiasi momento, SurfaceFlinger si attiva solo per accettare i buffer tra gli aggiornamenti del display, che possono variare a seconda del dispositivo. In questo modo, l'utilizzo della memoria viene ridotto al minimo ed è possibile evitare lo sfarfallio visibile sullo schermo, che può verificarsi quando si aggiorna il display durante l'aggiornamento.
Quando il display è tra un aggiornamento e l'altro, invia il segnale VSync a SurfaceFlinger. Il segnale VSync indica che il display può essere aggiornato senza tearing. Quando SurfaceFlinger riceve l'indicatore VSync, esamina l'elenco dei livelli alla ricerca di nuovi buffer. Se SurfaceFlinger trova un nuovo buffer, lo acquisisce; in caso contrario, continua a utilizzare il buffer acquisito in precedenza. SurfaceFlinger deve sempre mostrare qualcosa, quindi si blocca su un buffer. Se non sono mai stati inviati buffer su un livello, il livello viene ignorato.
Dopo che SurfaceFlinger ha raccolto tutti i buffer per i livelli visibili, chiede all'HWC (Hardware Composer) come eseguire la composizione. Se l'HWC contrassegni il tipo di composizione dei livelli come composizione client, SurfaceFlinger compone questi livelli. Quindi, SurfaceFlinger passa il buffer di output all'HWC.
WindowManager
WindowManager
controlla gli oggetti Window
,
che sono contenitori di oggetti View
. Gli oggetti Window
sono sempre supportati da oggetti
Surface
.
WindowManager
supervisiona i cicli di vita, gli eventi di input e di messa a fuoco, 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 quest'ultimo possa utilizzare questi dati per comporre le superfici sul display.
Prima della rotazione
Molti overlay hardware non supportano la rotazione (e anche se lo fanno, richiedono potenza di calcolo); la soluzione è trasformare il buffer prima che raggiunga SurfaceFlinger. Android supporta un suggerimento di 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, venga trasformato correttamente.
Ad esempio, quando ricevi un suggerimento per ruotare di 90 gradi, genera e applica una matrice al buffer per evitare che venga visualizzato oltre la fine della pagina. Per risparmiare energia, esegui questa operazione prima della rotazione. Per maggiori dettagli, consulta l'interfaccia ANativeWindow
definita in system/core/include/system/window.h
.