Google 致力于为黑人社区推动种族平等。查看具体举措
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Architettura grafica

Quello che ogni sviluppatore dovrebbe sapere sulle 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 come vengono utilizzati dal framework dell'app e dal sistema multimediale. L'attenzione si concentra sul modo in cui i buffer dei dati grafici si spostano nel sistema. Se ti sei mai chiesto perché SurfaceView e TextureView si comportano in questo modo o come interagiscono le superfici e EGLSurface, sei nel posto giusto.

Si presume 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 ottenere ciò, 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 di HAL ai casi d'uso. Inizia con una spiegazione dei buffer grafici Android, descrive la composizione e il meccanismo di visualizzazione, quindi procede ai meccanismi di livello superiore che forniscono i dati al compositore. Consigliamo di leggere le pagine nell'ordine elencato di seguito piuttosto che 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 del 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ù origini, li compone e li invia al display. Hardware Composer HAL (HWC) determina il modo più efficiente per composire 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 di buffer che viene spesso utilizzata da SurfaceFlinger. Quando si esegue 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 dell'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 attraverso il sistema operativo (per disegnare poligoni con texture, utilizzare chiamate GLES; per mettere il rendering sullo schermo, utilizzare chiamate EGL ). Questa pagina copre anche ANativeWindow, l'equivalente C / C ++ della classe Java Surface utilizzata per creare una superficie della finestra EGL dal codice nativo.
  • Vulkan . Vulkan è un'API multipiattaforma a basso overhead per grafica 3D ad alte prestazioni. Come OpenGL ES, Vulkan fornisce strumenti per la creazione di grafica di alta qualità in tempo reale 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).
  • SurfaceTexture . SurfaceTexture combina una superficie e una texture GLES per creare una BufferQueue per la quale la tua app è il consumatore. Quando un produttore accoda un nuovo buffer, notifica 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 con texture abilitando la post-elaborazione GPU di contenuti video protetti.
  • TextureView . TextureView combina una vista con un SurfaceTexture. TextureView avvolge un SurfaceTexture e si assume la responsabilità di rispondere ai callback e acquisire nuovi buffer. Durante il disegno, TextureView utilizza il contenuto del buffer ricevuto più di recente come origine dati, eseguendo il rendering ovunque e comunque lo stato di visualizzazione indichi che dovrebbe. La composizione della vista viene sempre eseguita con GLES, il che significa che gli aggiornamenti ai contenuti possono causare il ridisegno di altri elementi della vista.