Google si impegna a promuovere l'equità razziale per le comunità nere. Vedi come.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Grafica

Icona HAL di grafica Android

Il framework Android offre una varietà di API di rendering grafico per 2D e 3D che interagiscono con le implementazioni dei driver grafici dei produttori, quindi è importante avere una buona comprensione di come funzionano queste API a un livello superiore. Questa pagina introduce il livello di astrazione hardware grafico (HAL) su cui sono basati quei driver.

Gli sviluppatori di applicazioni disegnano le immagini sullo schermo in tre modi: con Canvas , OpenGL ES o Vulkan .

Componenti grafici Android

Indipendentemente dal rendering utilizzato dagli sviluppatori API, tutto viene eseguito il rendering su una "superficie". La superficie rappresenta il lato produttore di una coda di buffer che viene spesso utilizzata da SurfaceFlinger. Ogni finestra creata sulla piattaforma Android è supportata da una superficie. Tutte le superfici visibili renderizzate sono composte sul display da SurfaceFlinger.

Il diagramma seguente mostra come i componenti chiave lavorano insieme:

componenti di rendering delle immagini

Figura 1. Modalità di rendering delle superfici

I componenti principali sono descritti di seguito:

Produttori di stream di immagini

Un produttore di flussi di immagini può essere qualsiasi cosa produca buffer grafici per il consumo. Gli esempi includono decodificatori video OpenGL ES, Canvas 2D e 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 da 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 utilizzare flussi di immagini, ad esempio l'app fotocamera che utilizza un flusso di immagini di anteprima della fotocamera. Anche le applicazioni non GL possono essere utenti, ad esempio la classe ImageReader.

Compositore hardware

L'astrazione hardware per il sottosistema di visualizzazione. SurfaceFlinger può delegare determinati lavori di composizione a 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 un buffer o due in un terzo, ad esempio, utilizza OpenGL ES. Ciò rende la composizione meno potente rispetto al fatto che la GPU esegua tutti i calcoli.

Hardware Composer HAL svolge l'altra metà del lavoro ed è il punto centrale per tutto il rendering della grafica Android. Hardware Composer deve supportare eventi, uno dei quali è VSYNC (un altro è hotplug per il supporto plug-and-playHDMI).

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

Vedere il diagramma seguente per una rappresentazione della pipeline grafica di Android:

flusso di dati grafici

Figura 2. Flusso di dati grafici attraverso Android

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

BufferQueue

BufferQueues fornisce la colla tra i componenti grafici di Android. Queste sono una coppia di code che mediano il ciclo costante di buffer dal produttore al consumatore. Una volta che i produttori distribuiscono 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 unisce i produttori di flussi di immagini e i consumatori di flussi di immagini. Alcuni esempi di produttori di immagini sono le anteprime delle telecamere prodotte dai giochi HAL o OpenGL ES. Alcuni esempi di consumatori di immagini sono SurfaceFlinger o un'altra app che visualizza un flusso OpenGL ES, come l'app della fotocamera che visualizza 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, 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 consumare con un consumatore GL, tra le altre attività. BufferQueue può operare in tre diverse modalità:

Modalità simil-sincrona - BufferQueue per impostazione predefinita opera in una modalità simil-sincrona, in cui ogni buffer che proviene dal produttore si spegne al consumatore. Nessun buffer viene mai scartato in questa modalità. E se il produttore è troppo veloce e crea buffer più velocemente di quanto non vengano svuotati, bloccherà e attenderà buffer gratuiti.

Modalità non bloccante - BufferQueue può anche funzionare in una modalità non bloccante in cui genera un errore piuttosto che attendere un buffer in quei casi. Nessun buffer viene mai scartato in questa modalità. Ciò è utile per evitare potenziali deadlock nel software applicativo che potrebbero non comprendere le complesse dipendenze del framework grafico.

Discard mode - Infine, BufferQueue può essere configurato per scartare i vecchi buffer piuttosto che generare errori o attendere. Ad esempio, se si esegue il rendering GL in una vista di trama e si disegna il più rapidamente possibile, è necessario eliminare i buffer.

Per condurre la maggior parte di questo lavoro, SurfaceFlinger funge solo da un altro client OpenGL ES. Pertanto, quando SurfaceFlinger sta componendo attivamente un buffer o due in un terzo, ad esempio, utilizza OpenGL ES.

Hardware Composer HAL conduce l'altra metà del lavoro. Questo HAL funge da punto centrale per tutto il rendering della grafica Android.