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

Surface e SurfaceHolder

Gli oggetti di superficie consentono alle app di eseguire il rendering delle immagini da presentare sugli schermi. Le interfacce SurfaceHolder consentono alle app di modificare e controllare le superfici.

Superficie

Una superficie è un'interfaccia che consente a un produttore di scambiare buffer con un consumatore.

BufferQueue per una superficie di visualizzazione è in genere configurato per il triplo buffering. I buffer vengono allocati su richiesta, quindi se il produttore genera buffer abbastanza lentamente, ad esempio a 30 fps su un display a 60 fps, potrebbero esserci solo due buffer allocati nella coda. L'assegnazione di buffer su richiesta consente di ridurre al minimo il consumo di memoria. È possibile visualizzare un riepilogo dei buffer associati a ogni livello nell'output dumpsys SurfaceFlinger .

La maggior parte dei client esegue il rendering su superfici utilizzando OpenGL ES o Vulkan . Tuttavia, alcuni client eseguono il rendering sulle superfici utilizzando una tela.

Rendering su tela

L'implementazione del canvas è fornita dalla Skia Graphics Library . Se vuoi disegnare un rettangolo, chiama l'API Canvas, che imposta i byte in un buffer in modo appropriato. Per assicurarti che un buffer non venga aggiornato da due client contemporaneamente o scritto durante la visualizzazione, blocca il buffer per accedervi. Usa i seguenti comandi per lavorare con i blocchi canvas:

  • lockCanvas() blocca il buffer per il rendering sulla CPU e restituisce un Canvas da utilizzare per il disegno.
  • unlockCanvasAndPost() sblocca il buffer e lo invia al compositor.
  • lockHardwareCanvas() blocca il buffer per il rendering sulla GPU e restituisce una tela da utilizzare per il disegno.

La prima volta che il produttore richiede un buffer da un BufferQueue, il buffer viene allocato e inizializzato a zero. L'inizializzazione è necessaria per evitare di condividere inavvertitamente i dati tra i processi. Tuttavia, se riutilizzi un buffer, i contenuti precedenti sono ancora presenti. Se chiamate ripetutamente lockCanvas() e unlockCanvasAndPost() senza disegnare nulla, il produttore unlockCanvasAndPost() tra i fotogrammi renderizzati in precedenza.

Il codice di blocco / sblocco della superficie mantiene un riferimento al buffer renderizzato in precedenza. Se si specifica una regione sporca quando si blocca la superficie, vengono copiati i pixel non sporchi dal buffer precedente. SurfaceFlinger o HWC gestiscono tipicamente il buffer; ma poiché dobbiamo solo leggere dal buffer, non è necessario attendere l'accesso esclusivo.

SurfaceHolder

Un SurfaceHolder è un'interfaccia utilizzata dal sistema per condividere la proprietà delle superfici con le app. Alcuni client che lavorano con le superfici desiderano un SurfaceHolder, perché le API per ottenere e impostare i parametri della superficie vengono implementate tramite SurfaceHolder. Un SurfaceView contiene un SurfaceHolder.

La maggior parte dei componenti che interagiscono con una vista coinvolgono un SurfaceHolder. Alcune altre API, come MediaCodec, operano sulla superficie stessa.