Controllare la velocità di rendering

Android include alcune opzioni sviluppatore sul dispositivo che ti aiutano a visualizzare dove la tua app potrebbe riscontrare problemi di rendering della sua UI, ad esempio eseguendo più lavoro di rendering del necessario o eseguendo operazioni lunghe su thread e GPU. Questa pagina descrive come eseguire il debug dell'overdraw della GPU e profilare il rendering della GPU.

Per scoprire di più sulle opzioni sviluppatore sul dispositivo, incluso come attivarle, leggi Configurare le opzioni sviluppatore sul dispositivo.

Profilare la velocità di rendering della GPU

Lo strumento Rendering GPU mostra, come istogramma scorrevole, una rappresentazione visiva del tempo necessario per eseguire il rendering dei frame di una finestra UI rispetto a un benchmark di 16,67 ms per frame.

Sulle GPU meno potenti, la velocità di riempimento disponibile (la velocità con cui la GPU può riempire il frame buffer) può essere piuttosto bassa. Man mano che il numero di pixel necessari per disegnare un frame aumenta, la GPU potrebbe impiegare più tempo per elaborare i nuovi comandi, causando l'attesa del resto del sistema finché la GPU non riesce a recuperare.

Lo strumento di profilazione ti aiuta a identificare quando la GPU è sovraccarica nel tentativo di disegnare pixel o è appesantita da un overdraw elevato.

Abilitare il Profiler

Prima di iniziare, assicurati di utilizzare un dispositivo con Android 4.1 (livello API 16) o versioni successive e di attivare le opzioni sviluppatore. Per iniziare a profilare il rendering della GPU del dispositivo mentre utilizzi l'app:

  1. Sul dispositivo, vai a Impostazioni e tocca Opzioni sviluppatore.
  2. Nella sezione Monitoraggio, seleziona Rendering GPU profilo o Rendering HWUI profilo, a seconda della versione di Android in esecuzione sul dispositivo.
  3. Nella finestra di dialogo Rendering GPU profilo, scegli Su schermo come barre per sovrapporre i grafici sullo schermo del dispositivo.
  4. Apri l'app di cui vuoi creare il profilo.

Ispeziona l'output

Nell'immagine ingrandita del grafico Rendering GPU profilo mostrato nella figura 1, puoi vedere la sezione colorata, come visualizzata su Android 6.0 (livello API 23).

Figura 1. Grafico Rendering GPU ingrandito.

Di seguito sono riportati alcuni aspetti da tenere presente in merito all'output:

  • Per ogni applicazione visibile, lo strumento mostra un grafico.
  • Ogni barra verticale lungo l'asse orizzontale rappresenta un frame e l'altezza di ogni barra verticale rappresenta il tempo necessario per il rendering del frame (in millisecondi).
  • La linea verde orizzontale rappresenta 16,67 millisecondi. Per raggiungere i 60 fotogrammi al secondo, la barra verticale di ogni fotogramma deve rimanere sotto questa linea. Ogni volta che una barra supera questa linea, potrebbero esserci pause nelle animazioni.
  • Lo strumento evidenzia i frame che superano la soglia di 16,67 millisecondi rendendo la barra corrispondente più ampia e meno trasparente.
  • Ogni barra è composta da componenti colorati che corrispondono a una fase della pipeline di rendering. Il numero di componenti varia a seconda del livello API del dispositivo.

La tabella seguente fornisce le descrizioni di ogni segmento di una barra verticale nell'output del profiler quando utilizzi un dispositivo con Android 6.0 e versioni successive.

Componente della barraFase di renderingDescrizione
Scambia buffer Rappresenta il tempo in cui la CPU è in attesa che la GPU completi il suo lavoro. Se questa barra diventa alta, significa che l'app sta eseguendo troppo lavoro sulla GPU.
Problema con il comando Rappresenta il tempo impiegato dal renderer 2D di Android per inviare comandi a OpenGL per disegnare e ridisegnare gli elenchi di visualizzazione. L'altezza di questa barra è direttamente proporzionale alla somma del tempo necessario per l'esecuzione di ogni elenco visualizzato: più elenchi visualizzati equivalgono a una barra rossa più alta.
Sincronizzare e caricare Rappresenta il tempo necessario per caricare le informazioni bitmap nella GPU. Un segmento grande indica che l'app impiega molto tempo a caricare grandi quantità di elementi grafici.
Disegna Rappresenta il tempo utilizzato per registrare i comandi di disegno, ad esempio drawLine. In Compose, questa fase a volte può includere operazioni di misurazione e layout. Se questa barra è alta, acquisisci una traccia di sistema e analizzala utilizzando Perfetto per una suddivisione dettagliata.
Misura / Layout Rappresenta la quantità di tempo dedicata al posizionamento e alla determinazione delle dimensioni dei componenti UI durante la fase di layout, che include l'esecuzione dei modificatori di misurazione e posizionamento. Un segmento di grandi dimensioni indica calcoli complessi all'interno di questi modificatori o un albero di layout eccessivamente profondo che richiede un ricalcolo frequente.
Gestione dell'input e animazione Rappresenta il tempo impiegato per valutare le chiamate all'API Animation o per gestire l'input del puntatore e i relativi callback. Se questo segmento è grande, potrebbe indicare che un'animazione personalizzata o un callback di input richiede troppo tempo per l'elaborazione. Il calcolo dello stato e la mappatura dei dati durante lo scorrimento di un LazyColumn o di un LazyRow si verificano in genere anche durante questo segmento e sono una fonte più comune di rallentamenti in questo segmento.
Ritardo VSync / vario Rappresenta il tempo che l'app impiega per eseguire operazioni tra due fotogrammi consecutivi. Potrebbe indicare un'elaborazione eccessiva nel thread dell'interfaccia utente che potrebbe essere trasferita su un thread diverso.

Tabella 1. Barre dei componenti in Android 6.0 e versioni successive.

Per saperne di più su come interpretare le informazioni fornite dallo strumento di profilazione, leggi Analisi con Profilo GPU Rendering.