
Il framework Android offre una serie di API di rendering grafico per 2D e 3D che interagiscono con le implementazioni dei driver grafici dei produttori, pertanto è importante comprendere bene il funzionamento di queste API a un livello superiore. Questa pagina introduce il livello di astrazioni hardware (HAL) grafico su cui si basano questi driver. Prima di continuare con questa sezione, acquisisci familiarità con i seguenti termini:
Canvas
(elemento API)Surface
. La classe Canvas
ha metodi per il disegno standard di bitmap, linee, cerchi, rettangoli, testo e così via e è associata a una bitmap o una superficie. Una tela è il modo più semplice per disegnare oggetti 2D sullo schermo. La classe di base è
Canvas
.
android.graphics.drawable
.
Per ulteriori informazioni su drawable e altre risorse, consulta
Panoramica delle risorse dell'app.
android.opengl
e javax.microedition.khronos.opengles
espongono la funzionalità OpenGL ES.Surface
(elemento API)Surface
. Utilizza la classe
SurfaceView
anziché la classe
Surface
direttamente.
SurfaceView
(elemento API)View
che racchiude un oggetto Surface
per il disegno ed espone metodi per specificarne le dimensioni e il formato in modo dinamico. Una visualizzazione di superficie offre un modo per disegnare indipendentemente dal thread dell'interfaccia utente per operazioni che richiedono molte risorse, come giochi o anteprime della fotocamera, ma utilizza una memoria aggiuntiva. Una visualizzazione della superficie supporta sia la grafica canvas sia quella OpenGL ES. La classe di base per un oggetto SurfaceView
è
SurfaceView
.
R.style
e preceduti da Theme_
.View
(elemento API)View
è la classe di base
per la maggior parte dei componenti di layout di un'attività o di una schermata di dialogo, come le caselle di testo
e le finestre. Un oggetto View
riceve chiamate dal suo oggetto principale (vedi
ViewGroup
) per disegnare se stesso e informa l'oggetto principale
sulle sue dimensioni e sulla sua posizione preferite, che potrebbero non essere rispettate dall'oggetto principale. Per ulteriori informazioni, consulta
View
.
ViewGroup
(elemento API)android.widget
ma estendono la classe
ViewGroup
.
android.widget
. Window
(elemento API)Window
che specifica gli elementi di una finestra generica, come l'aspetto, il testo della barra del titolo, la posizione e i contenuti dei menu. Le finestre di dialogo e le attività utilizzano un'implementazione della classe Window
per visualizzare un oggetto Window
. Non è necessario implementare
la classe Window
o utilizzare finestre nell'app.Gli sviluppatori di app disegnano le immagini sullo schermo in tre modi: con Canvas, OpenGL ES o Vulkan.
Componenti grafici Android
Indipendentemente dall'API di rendering utilizzata dagli sviluppatori, tutto viene visualizzato su una superficie. La superficie rappresenta il lato del produttore di una fila di buffer spesso utilizzata da SurfaceFlinger. Ogni finestra creata sulla piattaforma Android è supportata da una superficie. Tutte le superfici visibili visualizzate vengono composte sul display da SurfaceFlinger.
Il seguente diagramma mostra l'interazione tra i componenti chiave:
Figura 1. Come vengono visualizzate le superfici.
I componenti principali sono descritti nelle sezioni seguenti.
Produttori di stream di immagini
Un produttore di stream di immagini può essere qualsiasi cosa produca buffer grafici per il consumo. Alcuni esempi sono OpenGL ES, Canvas 2D e decodificatori video mediaserver.
Utenti di flussi di immagini
Il consumatore più comune di stream di immagini è SurfaceFlinger, il servizio di sistema che utilizza le superfici attualmente visibili e le compone sul display utilizzando le informazioni fornite dal gestore delle finestre. SurfaceFlinger è l'unico servizio che può modificare i contenuti del display. SurfaceFlinger utilizza OpenGL e l'Hardware Composer (HWC) per comporre un gruppo di superfici.
Anche altre app OpenGL ES possono utilizzare stream di immagini, ad esempio l'app della fotocamera che utilizza uno stream di immagini di anteprima della fotocamera. Anche le app non GL possono essere consumatori, ad esempio la classe ImageReader.
Hardware Composer
L'astrazione hardware per il sottosistema di visualizzazione. SurfaceFlinger può delegato determinate operazioni di composizione all'HWC per scaricare il lavoro da OpenGL e dalla GPU. SurfaceFlinger agisce come un altro client OpenGL ES. Pertanto, quando SurfaceFlinger compone attivamente uno o due buffer in un terzo, ad esempio, utilizza OpenGL ES. In questo modo, il compositing richiede meno potenza rispetto a quando è la GPU a eseguire tutti i calcoli.
L'HAL Hardware Composer esegue l'altra metà del lavoro ed è il punto di riferimento per tutto il rendering grafico di Android. L'HWC deve supportare gli eventi, uno dei quali è VSync (un altro è hotplug per il supporto HDMI plug-and-play).
Gralloc
L'allocatore della memoria grafica (Gralloc) è necessario per allocare la memoria richiesta dai produttori di immagini. Per maggiori dettagli, consulta BufferQueue e Gralloc.
Flusso di dati
Il seguente diagramma mostra la pipeline grafica di Android:
Figura 2. I dati grafici vengono trasmessi tramite Android.
Gli oggetti a sinistra sono renderer che producono buffer grafici, come la schermata Home, la barra di stato e l'interfaccia utente di sistema. SurfaceFlinger è il compositore e HWC è il compositore.
BufferQueue
Le code di buffer forniscono il collegamento tra i componenti grafici di Android. Si tratta di una coppia di code che mediano il ciclo costante dei buffer dal produttore al consumatore. Dopo che i produttori hanno consegnato i propri buffer, SurfaceFlinger è responsabile della composizione di tutto sul display.
Il seguente diagramma illustra la procedura di comunicazione di BufferQueue:
Figura 3. Procedura di comunicazione BufferQueue.
BufferQueue contiene la logica che lega i produttori e i consumatori di stream di immagini. Alcuni esempi di produttori di immagini sono le anteprime della fotocamera prodotte dall'HAL della fotocamera o dai giochi OpenGL ES. Alcuni esempi di consumatori di immagini sono SurfaceFlinger o un'altra app che mostra uno stream OpenGL ES, come l'app della fotocamera che mostra il mirino della fotocamera.
BufferQueue è una struttura di dati che combina un pool di buffer con una coda e utilizza Binder IPC per passare i buffer tra i processi. L'interfaccia del produttore, ovvero ciò che viene passato a chi vuole generare buffer grafici, è IGraphicBufferProducer
(parte di SurfaceTexture
). Tra le altre attività, BufferQueue viene spesso utilizzato per eseguire il rendering su una superficie e per il consumo con un consumatore GL.
BufferQueue può funzionare in tre diverse modalità:
Per eseguire la maggior parte di questo lavoro, SurfaceFlinger agisce come un altro client OpenGL ES. Pertanto, quando SurfaceFlinger compone attivamente uno o due buffer in un terzo, ad esempio, utilizza OpenGL ES.
L'HAL Hardware Composer esegue l'altra metà del lavoro. Questo HAL funge da punto centrale per tutto il rendering grafico di Android.