Elementi grafici

Icona HAL grafica Android

Il framework Android offre una varietà di API di rendering grafico per 2D e 3D che interagiscono con le implementazioni dei produttori di driver grafici, quindi è importante comprendere bene come funzionano tali API a un livello superiore. Questa pagina introduce il livello di astrazione dell'hardware grafico (HAL) su cui sono basati questi driver. Prima di continuare con questa sezione, familiarizzare con i seguenti termini:

canvas (termine generico), Canvas (elemento API)
Una tela è una superficie di disegno che gestisce la composizione dei bit effettivi rispetto a una bitmap o a un oggetto Surface . Canvas dispone di metodi per il disegno computerizzato standard di bitmap, linee, cerchi, rettangoli, testo e così via ed è associato a una bitmap o superficie. Una tela è il modo più semplice e facile per disegnare oggetti 2D sullo schermo. La classe base è Canvas .
disegnabile
Un drawable è una risorsa visiva compilata che può essere utilizzata come sfondo, titolo o altra parte dello schermo. Un drawable viene in genere caricato in un altro elemento dell'interfaccia utente, ad esempio come immagine di sfondo. Un drawable non è in grado di ricevere eventi, ma assegna varie altre proprietà come stato e pianificazione, per abilitare sottoclassi come oggetti di animazione o librerie di immagini. Molti oggetti disegnabili vengono caricati da file di risorse disegnabili: file XML o bitmap che descrivono l'immagine. Le risorse drawable sono compilate in sottoclassi di android.graphics.drawable . Per ulteriori informazioni sui drawable e altre risorse, vedere Risorse .
risorsa di layout
Una risorsa di layout è un file XML che descrive il layout di una schermata di attività. Per ulteriori informazioni, consulta Risorsa layout .
nove patch (9 patch, NinePatch)
Una nove patch è una risorsa bitmap ridimensionabile che può essere utilizzata per sfondi o altre immagini sul dispositivo. Per ulteriori informazioni, vedere Nove patch .
OpenGL ES
OpenGL ES è un'API multipiattaforma per il rendering di grafica 2D e 3D. Android fornisce librerie OpenGL ES per il rendering 3D con accelerazione hardware. Per il rendering 2D, una tela è l'opzione più semplice. OpenGL ES è disponibile nell'Android Native Development Kit (NDK) . I pacchetti android.opengl e javax.microedition.khronos.opengles espongono la funzionalità OpenGL ES.
superficie (termine generico), Surface (elemento API)
Una superficie rappresenta un blocco di memoria che viene composto sullo schermo. Una superficie contiene una tela su cui disegnare e fornisce vari metodi di supporto per disegnare livelli e ridimensionare l'oggetto Surface . Utilizzare direttamente la classe SurfaceView anziché la classe Surface .
vista di superficie (termine generico), SurfaceView (elemento API)
Una vista di superficie è un oggetto 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 fornisce un modo per disegnare in modo indipendente dal thread dell'interfaccia utente per operazioni ad uso intensivo di risorse, come giochi o anteprime della fotocamera, ma di conseguenza utilizza memoria aggiuntiva. Una vista di superficie supporta sia la grafica Canvas che quella OpenGL ES. La classe base per un oggetto SurfaceView è SurfaceView .
tema
Un tema è un insieme di proprietà, come la dimensione del testo e il colore dello sfondo, raggruppate insieme per definire varie impostazioni di visualizzazione predefinite. Android fornisce alcuni temi standard, elencati in R.style e preceduti da Theme_ .
view (termine generico), View (elemento API)
Una vista disegna un'area rettangolare sullo schermo e gestisce clic, pressioni di tasti e altri eventi di interazione. La classe View è la classe base per la maggior parte dei componenti di layout di un'attività o di una schermata di dialogo, come caselle di testo e finestre. Un oggetto View riceve chiamate dal suo oggetto genitore (vedi ViewGroup ) per disegnare se stesso e informa il suo oggetto genitore sulla sua dimensione preferita e sulla sua posizione, che potrebbe non essere rispettata dal genitore. Per ulteriori informazioni, vedere View .
view group (termine generico), ViewGroup (elemento API)
Un gruppo di viste raggruppa un insieme di viste secondarie. Il gruppo di visualizzazione è responsabile di decidere dove posizionare le visualizzazioni secondarie e quanto possono essere grandi, nonché di chiamare ciascuna di esse a disegnare da sola quando appropriato. Alcuni gruppi di visualizzazioni sono invisibili e servono solo per il layout, mentre altri hanno un'interfaccia utente intrinseca, come una casella di riepilogo a scorrimento. I gruppi di visualizzazione si trovano nel pacchetto widget , ma estendono la classe ViewGroup .
visualizzare la gerarchia
Una gerarchia di visualizzazioni è una disposizione di oggetti di visualizzazione e di gruppi di visualizzazioni che definisce l'interfaccia utente per ciascun componente di un'app. La gerarchia è costituita da gruppi di viste che contengono una o più viste o gruppi di viste secondari. È possibile ottenere una rappresentazione visiva di una gerarchia di visualizzazione per il debug e l'ottimizzazione utilizzando il Visualizzatore gerarchia fornito con Android SDK.
Vulcano
Vulkan è un'API multipiattaforma a basso costo per grafica 3D ad alte prestazioni.
aggeggio
Un widget fa parte di un insieme di sottoclassi di visualizzazione completamente implementate che eseguono il rendering degli elementi del modulo e di altri componenti dell'interfaccia utente, come una casella di testo o un menu a comparsa. Poiché un widget è completamente implementato, gestisce la misurazione, il disegno stesso e la risposta agli eventi sullo schermo. I widget si trovano nel pacchetto android.widget .
finestra (termine generico), Window (elemento API)
In un'app Android, una finestra è un oggetto derivato dalla classe astratta Window che specifica gli elementi di una finestra generica, come l'aspetto grafico, il testo della barra del titolo e la posizione e il contenuto dei menu. Le finestre di dialogo e le attività utilizzano un'implementazione della classe Window per eseguire il rendering di un oggetto Window . Non è necessario implementare la classe Window o utilizzare Windows nella tua app.

Gli sviluppatori di app disegnano 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 renderizzato su una superficie. La superficie rappresenta il lato produttore di una coda buffer che viene spesso utilizzata da SurfaceFlinger. Ogni finestra creata sulla piattaforma Android è supportata da una superficie. Tutte le superfici visibili renderizzate vengono composte sul display da SurfaceFlinger.

Il diagramma seguente mostra come interagiscono i componenti chiave:

componenti per il rendering delle immagini

Figura 1. Come vengono renderizzate le superfici.

I componenti principali sono descritti di seguito:

Produttori di flussi di immagini

Un produttore di flusso di immagini può essere qualsiasi cosa che produca buffer grafici per il consumo. Gli esempi includono OpenGL ES, Canvas 2D e decoder video mediaserver.

Consumatori di flussi di immagini

Il consumatore più comune di flussi di immagini è SurfaceFlinger, il servizio di sistema che consuma le superfici attualmente visibili e le compone sul display utilizzando le informazioni fornite dal Window Manager. SurfaceFlinger è l'unico servizio in grado di modificare il contenuto del display. SurfaceFlinger utilizza OpenGL e Hardware Composer per comporre un gruppo di superfici.

Anche altre app OpenGL ES possono consumare flussi di immagini, ad esempio l'app della fotocamera che consuma un flusso di immagini di anteprima della fotocamera. Anche le app non GL possono essere consumer, ad esempio la classe ImageReader.

Compositore hardware

L'astrazione hardware per il sottosistema di visualizzazione. SurfaceFlinger può delegare determinati lavori di composizione all'Hardware Composer per scaricare il lavoro da OpenGL e dalla GPU. SurfaceFlinger agisce come un altro client OpenGL ES. Pertanto, quando SurfaceFlinger sta componendo attivamente uno o due buffer in un terzo, ad esempio, utilizza OpenGL ES. Ciò rende la composizione meno potente rispetto a quando la GPU esegue tutti i calcoli.

L' HAL del compositore hardware svolge l'altra metà del lavoro ed è il punto centrale per tutto il rendering grafico di Android. L'Hardware Composer deve supportare gli eventi, uno dei quali è VSYNC (un altro è hotplug per il supporto HDMI plug-and-play).

Gralloc

L'allocatore di memoria grafica (Gralloc) è necessario per allocare la memoria richiesta dai produttori di immagini. Per i dettagli, vedere Gralloc HAL .

Flusso di dati

Consulta il diagramma seguente per una rappresentazione della pipeline grafica Android:

flusso di dati grafici

Figura 2. Flusso di dati grafici attraverso Android

Gli oggetti a sinistra sono renderer che producono buffer grafici, come la schermata iniziale, la barra di stato e l'interfaccia utente del sistema. SurfaceFlinger è il compositore e Hardware Composer è il compositore.

BufferQueue

BufferQueues forniscono il collante tra i componenti grafici Android. Si tratta di una coppia di code che mediano il ciclo costante di buffer dal produttore al consumatore. Una volta che i produttori consegnano i loro buffer, SurfaceFlinger è responsabile della composizione di tutto sul display.

Vedere il diagramma seguente per il processo di comunicazione BufferQueue.

Processo di comunicazione BufferQueue

Figura 3. Processo di comunicazione BufferQueue

BufferQueue contiene la logica che lega insieme i produttori del flusso di immagini e i consumatori del flusso di immagini. Alcuni esempi di produttori di immagini sono le anteprime della fotocamera prodotte dai giochi HAL o OpenGL ES della fotocamera. Alcuni esempi di consumatori di immagini sono SurfaceFlinger o un'altra app che visualizza un flusso OpenGL ES, ad esempio l'app della fotocamera che mostra il mirino della fotocamera.

BufferQueue è una struttura 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, o ciò che passi a qualcuno che vuole generare buffer grafici, è IGraphicBufferProducer (parte di SurfaceTexture ). BufferQueue viene spesso utilizzato per eseguire il rendering su una superficie e utilizzarlo con un consumatore GL, tra le altre attività.

BufferQueue può funzionare in tre diverse modalità:

Modalità di tipo sincrono : BufferQueue per impostazione predefinita funziona in modalità di tipo sincrono, in cui ogni buffer in arrivo dal produttore esce dal consumatore. Nessun buffer viene mai scartato in questa modalità. E se il produttore è troppo veloce e crea buffer più velocemente di quanto vengano svuotati, si bloccherà e attenderà i buffer liberi.

Modalità non bloccante : BufferQueue può anche funzionare in modalità non bloccante in cui genera un errore anziché attendere un buffer in questi casi. Nessun buffer viene mai scartato neanche in questa modalità. Ciò è utile per evitare potenziali blocchi nel software applicativo che potrebbe non comprendere le complesse dipendenze del framework grafico.

Modalità Scarta : infine, BufferQueue può essere configurato per eliminare i vecchi buffer anziché generare errori o attendere. Ad esempio, se si esegue il rendering GL su una vista texture e si disegna il più rapidamente possibile, i buffer devono essere eliminati.

Per svolgere la maggior parte di questo lavoro, SurfaceFlinger agisce come un altro client OpenGL ES. Pertanto, quando SurfaceFlinger sta componendo attivamente uno o due buffer in un terzo, ad esempio, utilizza OpenGL ES.

L'HAL del compositore hardware esegue l'altra metà del lavoro. Questo HAL funge da punto centrale per tutto il rendering grafico Android.