Architettura grafica

Ciò che ogni sviluppatore dovrebbe sapere su superfici, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger e Vulkan.

Questa pagina descrive gli elementi essenziali dell'architettura grafica a livello di sistema Android e il modo in cui vengono utilizzati dal framework dell'app e dal sistema multimediale. L'attenzione è focalizzata sul modo in cui i buffer di dati grafici si muovono attraverso il sistema. Se ti sei mai chiesto perché SurfaceView e TextureView si comportano in un certo modo o come interagiscono le superfici e EGLSurface, sei nel posto giusto.

Si presuppone una certa familiarità con i dispositivi Android e lo sviluppo di app. Non è necessaria una conoscenza dettagliata del framework dell'app e vengono menzionate pochissime chiamate API, ma il materiale non si sovrappone ad altra documentazione pubblica. L'obiettivo è fornire dettagli sugli eventi significativi coinvolti nel rendering di un frame per l'output per aiutarti a fare scelte informate durante la progettazione di un'app. Per raggiungere questo obiettivo, lavoriamo dal basso verso l'alto, descrivendo come funzionano le classi dell'interfaccia utente piuttosto che come possono essere utilizzate.

Questa sezione include diverse pagine che coprono tutto, dal materiale di base ai dettagli HAL ai casi d'uso. Inizia con una spiegazione dei buffer grafici di Android, descrive la composizione e il meccanismo di visualizzazione, quindi procede ai meccanismi di livello superiore che forniscono dati al compositore. Ti consigliamo di leggere le pagine nell'ordine elencato di seguito anziché saltare a un argomento che sembra interessante.

Componenti di basso livello

  • BufferQueue e gralloc . BufferQueue collega qualcosa che genera buffer di dati grafici (il produttore ) a qualcosa che accetta i dati per la visualizzazione o l'ulteriore elaborazione (il consumatore ). Le allocazioni di buffer vengono eseguite tramite l'allocatore di memoria gralloc implementato tramite un'interfaccia HAL specifica del fornitore.
  • SurfaceFlinger, Hardware Composer e display virtuali . SurfaceFlinger accetta buffer di dati da più fonti, li compone e li invia al display. L'Hardware Composer HAL (HWC) determina il modo più efficiente per comporre i buffer con l'hardware disponibile e i display virtuali rendono disponibile l'output composito all'interno del sistema (registrando lo schermo o inviando lo schermo su una rete).
  • Surface, Canvas e SurfaceHolder . Una superficie produce una coda buffer che viene spesso utilizzata da SurfaceFlinger. Durante il rendering su una superficie, il risultato finisce in un buffer che viene spedito al consumatore. Le API Canvas forniscono un'implementazione software (con supporto per l'accelerazione hardware) per disegnare direttamente su una superficie (alternativa di basso livello a OpenGL ES). Tutto ciò che ha a che fare con una vista coinvolge un SurfaceHolder, le cui API consentono di ottenere e impostare parametri di superficie come dimensione e formato.
  • EGLSurface e OpenGL ES . OpenGL ES (GLES) definisce un'API di rendering grafico progettata per essere combinata con EGL , una libreria che può creare e accedere a finestre tramite il sistema operativo (per disegnare poligoni con texture, utilizzare le chiamate GLES; per mettere il rendering sullo schermo, utilizzare le chiamate EGL ). Questa pagina tratta anche ANativeWindow, l'equivalente C/C++ della classe Java Surface utilizzata per creare una superficie di finestra EGL dal codice nativo.
  • Vulcano . Vulkan è un'API multipiattaforma a basso costo per grafica 3D ad alte prestazioni. Come OpenGL ES, Vulkan fornisce strumenti per la creazione di grafica in tempo reale di alta qualità nelle app. I vantaggi di Vulkan includono la riduzione del sovraccarico della CPU e il supporto per il linguaggio SPIR-V Binary Intermediate .

Componenti di alto livello

  • SurfaceView e GLSurfaceView . SurfaceView combina una superficie e una vista. I componenti di visualizzazione di SurfaceView sono composti da SurfaceFlinger (e non dall'app), consentendo il rendering da un thread/processo separato e l'isolamento dal rendering dell'interfaccia utente dell'app. GLSurfaceView fornisce classi helper per gestire i contesti EGL, la comunicazione tra thread e l'interazione con il ciclo di vita dell'attività (ma non è necessario per utilizzare GLES).
  • SuperficieTexture . SurfaceTexture combina una superficie e una trama GLES per creare un BufferQueue di cui l'app è il consumatore. Quando un produttore mette in coda un nuovo buffer, avvisa la tua app, che a sua volta rilascia il buffer precedentemente conservato, acquisisce il nuovo buffer dalla coda ed effettua chiamate EGL per rendere il buffer disponibile a GLES come texture esterna. Android 7.0 ha aggiunto il supporto per la riproduzione sicura di video di texture consentendo la post-elaborazione GPU di contenuti video protetti.
  • TextureView . TextureView combina una vista con una SurfaceTexture. TextureView avvolge un SurfaceTexture e si assume la responsabilità di rispondere ai callback e di acquisire nuovi buffer. Durante il disegno, TextureView utilizza il contenuto del buffer ricevuto più recentemente come origine dati, eseguendo il rendering dove e come lo stato di visualizzazione indica che dovrebbe. La composizione della vista viene sempre eseguita con GLES, il che significa che gli aggiornamenti ai contenuti possono causare il ridisegno anche di altri elementi della vista.