Identifica le pass per il rendering più costose

AGI Frame Profiler ti consente di esaminare singoli pass di rendering utilizzati per comporre un singolo frame della tua app. A tale scopo, intercetta e registra tutto lo stato necessario per l'esecuzione di ogni chiamata all'API grafica. Su Vulkan tutto questo viene fatto in modo nativo usando il suo sistema di livelli. In OpenGL, i comandi vengono intercettati tramite ANGLE, che converte i comandi OpenGL in chiamate Vulkan in modo che possano essere eseguiti sull'hardware.

Dispositivi Adreno

Per identificare le costose tessere di rendering, guarda innanzitutto la sequenza temporale di AGI nella parte superiore della finestra. Questo mostra tutte le tessere di rendering che comprendono la composizione di un dato frame in ordine cronologico. È la stessa visualizzazione che vedresti nel System Profiler se avessi informazioni sulle code GPU. Presenta anche informazioni di base sul passaggio per il rendering, ad esempio la risoluzione dei framebuffer che vengono sottoposti a rendering, che possono fornire informazioni su ciò che sta accadendo nel passaggio di rendering stesso.

Crea frame per la visualizzazione della cronologia
Figura 1. Visualizzazione della sequenza temporale dei frame

Il primo criterio che puoi utilizzare per esaminare le tessere di rendering è il tempo che richiedono. Il passaggio per il rendering più lungo sarà probabilmente quello con il maggiore potenziale di miglioramento, quindi inizia dando un'occhiata a questo.

Identificazione del pass di rendering più lungo nella visualizzazione della sequenza temporale dei frame
Figura 2. Identificare il pass di rendering più lungo nella visualizzazione della sequenza temporale del frame

La sezione GPU relativa al pass di rendering pertinente presenterà già alcune informazioni su ciò che sta accadendo all'interno del pass per il rendering:

  1. Binning: dove i vertici sono inseriti in fasce in base a dove finiscono sullo schermo
  2. Rendering: dove sono ombreggiati pixel o frammenti
  3. Caricamento/archiviazione GMEM: quando i contenuti di un framebuffer vengono caricati o archiviati dalla memoria GPU interna alla memoria principale.

Puoi farti un'idea di dove potrebbero trovarsi i potenziali colli di bottiglia osservando quanto tempo impiega ognuno di questi elementi nel pass per il rendering. Ecco alcuni esempi:

  • Se la bining richiede molto tempo, questo suggerisce un collo di bottiglia con i dati dei vertici che suggeriscono troppi vertici, vertici di grandi dimensioni o altri problemi relativi ai vertici.
  • Se il rendering richiede la maggior parte del tempo, questo suggerisce che l'ombreggiatura è il collo di bottiglia. Le possibili cause possono essere Shader complessi, troppi recuperi di texture, il rendering in un framebuffer ad alta risoluzione quando non è necessario o altri problemi correlati.

Anche i negozi e i caricamenti del GMEM sono aspetti da tenere a mente. È costoso spostare elementi dalla memoria grafica alla memoria principale, quindi ridurre al minimo la quantità di operazioni di caricamento o di archiviazione contribuirà anche alle prestazioni. Un esempio comune di ciò è avere uno stencil/profondità di un archivio GMEM, che scrive il buffer di profondità/stencil nella memoria principale. Se non utilizzi quel buffer in futuri passaggi di rendering, puoi eliminare questa operazione di archiviazione e farti risparmiare tempo di frame e larghezza di banda della memoria.

Identificazione di carichi e negozi GMEM
Figura 3. Identificazione di carichi e negozi GMEM

Indagine sul superamento della visualizzazione di grandi dimensioni

Per vedere tutti i singoli comandi di disegno emessi durante il passaggio del rendering:

  1. Fai clic sul pass per il rendering nella sequenza temporale. In questo modo viene aperta la tessera di rendering nella gerarchia disponibile nel riquadro Comandi di Frame Profiler.

  2. Fai clic sul menu del rendering pass, che mostra tutti i singoli comandi di tracciamento emessi durante il rendering. Se si tratta di un'applicazione OpenGL, puoi scavare ulteriormente e vedere i comandi Vulkan emessi da ANGLE.

Riquadro dei comandi
Figura 4. Riquadro Comandi

Seleziona una delle chiamate di disegno. Si apre il riquadro Framebuffer, che mostra tutti gli allegati del framebuffer associati durante questo disegno e il risultato finale del disegno sul framebuffer allegato. Qui puoi anche utilizzare l'AGI per aprire la chiamata al disegno precedente e quella successiva e confrontare la differenza tra le due. Se sono visivamente quasi identici, ciò suggerisce l'opportunità di eliminare un richiamo che non contribuisce all'immagine finale.

Selezione di singole chiamate di disegno nel riquadro Comandi
Figura 5. Selezionare singole chiamate di disegno nel riquadro Comandi

L'apertura del riquadro pipeline per questo disegno mostra lo stato utilizzato dalla pipeline grafica per eseguire la chiamata di disegno.

Riquadro pipeline
Figura 6. Riquadro della pipeline

L'Assembler di input fornisce informazioni su come i dati del vertice sono stati associati a questo disegno. Questa è una buona area da esaminare se hai notato che il binning occupa gran parte del tempo del tuo pass di rendering; qui puoi ottenere informazioni sul formato dei vertici, sul numero di vertici tracciati e su come i vertici sono disposti in memoria. Per ulteriori informazioni su questo argomento, consulta Analisi dei formati dei vertici.

Sezione Assembler di input nel riquadro Pipeline
Figura 7. Inserisci la sezione Assembler nel riquadro Pipeline

La sezione Vertex Shader fornisce informazioni sul Vertex Shader utilizzato durante questo disegno e può anche essere un buon posto per esaminare se il binning è stato identificato come un problema. Puoi vedere lo SPIR-V e il GLSL decompilato dello shader utilizzato ed esaminare i buffer uniformi associati per questa chiamata. Per ulteriori dettagli, consulta Analizzare le prestazioni del mesh.

Sezione Vertex Shader nel riquadro Pipeline
Figura 8. Sezione Vertex Shader nel riquadro Pipeline

La sezione Rasterizer mostra informazioni sulla configurazione delle funzioni più fisse della pipeline e può essere utilizzata maggiormente per il debug dello stato delle funzioni fisse, ad esempio area visibile, forbice, stato di profondità e modalità poligono.

Sezione di rasterizzazione nel riquadro Pipeline
Figura 9. Sezione Rasterizer nel riquadro Pipeline

La sezione Fragment Shader fornisce molte delle stesse informazioni presenti nella sezione Vertex Shader, ma specifiche per Fragment Shader. In questo caso, puoi effettivamente vedere quali texture sono associate e analizzarle facendo clic sul punto di manipolazione.

Sezione Shader frammento nel riquadro Pipeline
Figura 10. Sezione Shader frammento nel riquadro Pipeline

Indagine sul superamento della visualizzazione ridotta

Un altro criterio che puoi utilizzare per migliorare le prestazioni della GPU è esaminare gruppi di passaggi di rendering più piccoli. In generale, vuoi ridurre il più possibile la quantità di pass di rendering, dato che la GPU impiega del tempo per aggiornare lo stato da un pass di rendering all'altro. Questi pass di rendering più piccoli vengono solitamente utilizzati per attività come generare mappe delle ombre, applicare sfocatura gaussiana, stimare la luminanza, eseguire effetti di post-elaborazione o eseguire il rendering dell'interfaccia utente. Alcuni di questi possono essere potenzialmente consolidati in un unico passaggio per il rendering, oppure eliminati completamente se non influenzano l'immagine complessiva in modo sufficiente a giustificarne il costo.

Pass di rendering più piccoli utilizzati per sottocampionare il buffer di risoluzione nativo
Figura 11. Pass di rendering più piccoli utilizzati per sottocampionare il buffer di risoluzione nativo