Questa pagina spiega che cos'è il overdraw, come diagnosticarlo e i modi per eliminarlo o ridurlo.
Quando un'app disegna lo stesso pixel più di una volta in un singolo frame, si parla di overdraw. In genere l'overdragamento non è necessario ed è meglio eliminarlo. L'overdraw diventa un problema di prestazioni quando spreca tempo nella GPU per eseguire il rendering dei pixel che non contribuiscono a ciò che l'utente vede sullo schermo.
Informazioni su overdraw
Con overdraw si intende il disegno del sistema di un pixel sullo schermo più volte in un singolo frame di rendering. Ad esempio, se hai un gruppo di schede dell'interfaccia utente impilate, ogni scheda nasconde una parte di quella sottostante.
Tuttavia, il sistema deve comunque disegnare le parti nascoste delle carte nello stack. Questo perché le carte impilate vengono visualizzate in base all'algoritmo del pittore, ovvero in ordine back-to-front. Questa sequenza di rendering consente al sistema di applicare una corretta fusione alfa agli oggetti traslucidi come le ombre.
Trovare problemi di overdraw
La piattaforma offre i seguenti strumenti per aiutarti a determinare se l'overdraw sta influenzando le prestazioni della tua app.
Strumento di debug overdraw GPU
Lo strumento Debug GPU Overdraw utilizza la codifica a colori per mostrare il numero di volte in cui l'app disegna ogni pixel sullo schermo. Più alto è questo conteggio, più è probabile che il sovraccarico incida sulle prestazioni della tua app.
Per ulteriori informazioni, consulta la sezione Visualizzare l'overdraw della GPU.
Strumento di rendering GPU del profilo
Lo strumento Profile GPU Rendering mostra il tempo impiegato da ogni fase della pipeline di rendering per visualizzare un singolo frame come istogramma scorrevole. La parte Process di ogni barra, indicata in arancione, mostra quando il sistema sta scambiando i buffer. Questa metrica fornisce indizi importanti sulla sovrascrittura.
Sulle GPU meno performanti, il tasso di riempimento disponibile, ovvero la velocità alla quale la GPU può riempire il buffer di frame, può essere basso. Con l'aumento del numero di pixel necessari per disegnare un frame, la GPU potrebbe impiegare più tempo per elaborare i nuovi comandi e chiedere al resto del sistema di attendere finché non riesce a recuperare. La barra Process (Processi) mostra questo picco quando la GPU si sovraccarica quando tenta di disegnare i pixel il più velocemente possibile. Anche problemi diversi dai numeri non elaborati di pixel possono causare un picco di questa metrica. Ad esempio, se lo strumento di debug dell'overdraw della GPU mostra forti picchi di overdraw e processi, è probabile che esista un problema di overdraw.
Per ulteriori informazioni, consulta Profilo della velocità di rendering della GPU.
Correggi overdraw
Per ridurre o eliminare il sovraccarico, puoi procedere nel seguente modo:
- Rimuovi gli sfondi non necessari dai layout.
- Appiattire la gerarchia delle visualizzazioni.
- Ridurre la trasparenza.
Questa sezione fornisce informazioni su ciascuno di questi approcci.
Rimuovi gli sfondi non necessari dai layout
Per impostazione predefinita, un layout non ha uno sfondo, il che significa che non esegue il rendering diretto di alcun elemento. Tuttavia, se i layout hanno sfondi, potrebbero contribuire all'overdraw.
Puoi migliorare le prestazioni del rendering rimuovendo gli sfondi non necessari. Uno sfondo non necessario potrebbe non essere visibile perché è completamente coperto da tutto ciò che l'app sta disegnando sopra. Ad esempio, il sistema potrebbe coprire completamente lo sfondo di un elemento principale quando disegna delle visualizzazioni secondarie sopra l'elemento.
Per scoprire perché stai eseguendo il overdraging, osserva la gerarchia nello strumento Controllo layout. Puoi cercare gli sfondi che non sono visibili all'utente ed eliminarli. Puoi eliminare gli sfondi non necessari ovunque ci siano molti container che condividono un colore di sfondo comune. Puoi impostare lo sfondo della finestra sul colore di sfondo principale dell'app e lasciare tutti i container sopra di esso senza definire valori di sfondo.
Appiattire la gerarchia delle visualizzazioni
I layout moderni ti aiutano a sovrapporre e sovrapporre le visualizzazioni per ottenere un design accattivante. Tuttavia, questo può compromettere le prestazioni con conseguenti overdraw, soprattutto in scenari in cui ogni oggetto della visualizzazione in pila è opaco, richiedendo il disegno di pixel sia visibili sia non visibili sullo schermo.
Se riscontri questo problema, potresti migliorare le prestazioni ottimizzando la gerarchia delle visualizzazioni per ridurre il numero di oggetti UI che si sovrappongono. Per ulteriori informazioni su come eseguire questa operazione, consulta Rendimento e gerarchie delle visualizzazioni.
Ridurre la trasparenza
Il rendering di pixel trasparenti sullo schermo, noto come rendering alfa, è un fattore determinante per l'overdraw. A differenza dell'overdraw standard, quando il sistema nasconde completamente i pixel disegnati esistenti disegnandoci sopra pixel opachi, gli oggetti trasparenti richiedono prima il disegno dei pixel esistenti, in modo che possa verificarsi la giusta equazione di combinazione.
Gli effetti visivi come animazioni trasparenti, dissolvenze e ombre comportano una certa trasparenza e possono quindi contribuire in modo significativo all'overdragamento. In queste situazioni, puoi migliorare l'overdraw riducendo il numero di oggetti trasparenti visualizzati. Ad esempio, puoi ottenere testo grigio disegnando testo nero in una TextView
con un valore alfa traslucido impostato. Tuttavia, puoi ottenere lo stesso effetto con prestazioni migliori
disegnando il testo in grigio.
Per scoprire di più sui costi delle prestazioni che la trasparenza impone nell'intera pipeline di disegno, guarda il video Hidden Costs of Transparency (Costi nascosti della trasparenza).