Stima i tempi di elaborazione dei frame di CPU e GPU

La stima dei tempi di elaborazione dei frame (tempi di frame) della CPU e della GPU è essenziale per comprendere le prestazioni dell'app e individuare i colli di bottiglia. Quando profili un'app con AGI, lo strumento System Profiler fornisce i dati di traccia che puoi utilizzare per stimare i tempi di frame.

Tempi della CPU

In AGI, puoi visualizzare i tempi di frame della CPU totale e attiva nel canale CPU di un profilo di sistema.

Tempo di CPU totale

Per misurare il tempo totale della CPU speso, seleziona l'intervallo di tempo che include il tempo tra gli eventi di invio di frame successivi. Gli eventi di invio del frame sono eglSwapBuffers (per OpenGL) e vkQueuePresentKHR (per Vulkan).

Uno screenshot degli eventi eglSwapBuffer.
Figura 1. Tempo tra due eventi eglSwapBuffer.


Uno screenshot di un evento vkQueuePresentKHR.
Figura 2. Tempo tra due eventi vkQueuePresentKHR.

Questa misurazione è una stima del tempo CPU totale,ma non rappresenta necessariamente il tempo CPU attivo. Ad esempio, nelle app legate alla GPU, la CPU potrebbe attendere che la GPU completi il proprio lavoro prima di inviare un nuovo frame. Questo accade spesso quando un evento dequeueBuffer, eglSwapBuffer (per OpenGL) o vkQueuePresent (per Vulkan) occupa una grande parte del tempo della CPU. Il tempo di attesa è incluso nel tempo CPU totale, ma non nel tempo CPU attivo.

Uno screenshot che mostra una grande quantità di inattività durante gli eventi dequeueBuffer ed eglSwapBuffer.
Figura 3. Un elevato tempo di inattività della CPU durante gli eventi dequeueBuffer e eglSwapBuffer.

Tempo di CPU attivo

Il tempo della CPU attivo determina quando la CPU esegue il codice dell'app senza essere in stato di inattività.

Per misurare il tempo della CPU attiva, visualizza le sezioni In esecuzione appena sopra gli eventi della CPU. Conta tutte le parti della traccia tra i due eventi di invio del frame in stato In esecuzione. Assicurati di includere i thread in esecuzione.

Uno screenshot di due periodi di tempo della CPU che possono essere utilizzati per misurare il tempo della CPU attivo.
Figura 5. Due periodi di tempo della CPU che possono essere utilizzati per misurare il tempo di CPU attivo.


Uno screenshot di un'app multithread che ha altri thread in esecuzione mentre il thread principale è inattivo.
Figura 6. Un'app multithread con altri thread di lavoro mentre il thread principale è inattivo.

Un altro modo per misurare il tempo CPU attivo è visualizzare i segmenti di app nei canali CPU. Questi slice indicano quando la CPU è in esecuzione e corrispondono ai slice In esecuzione.

Uno screenshot che mostra lo stato di esecuzione di un thread bloccato che corrisponde al canale della CPU.
Figura 7. Lo stato di esecuzione del thread bloccato corrisponde al canale CPU.

Per identificare più facilmente i segmenti di app, puoi aggiungere alla tua app indicatori ATrace. Questi indicatori verranno visualizzati nel canale CPU di System Profiler.

Uno screenshot degli slice ATrace mostrati in un canale CPU.
Figura 8. Slice ATrace mostrati in un canale CPU.

Stimare i tempi di frame della GPU

Per stimare i tempi di frame della GPU, puoi utilizzare i seggiolini della GPU o i contatori della GPU in System Profiler. La stima è più accurata quando si utilizzano i segmenti GPU.

Slice GPU

Se lo strumento di analisi del sistema dispone di informazioni sui segmenti GPU, puoi ottenere informazioni molto precise sulla durata frame della GPU misurando il tempo totale impiegato dall'app per le attività associate a un singolo frame.

Dispositivi Mali

Sui dispositivi Mali, i segmenti GPU hanno tracce fragment, non-fragment e talvolta non-fragment supplementari. Per i frame meno complessi, il lavoro dei frammenti e non è sequenziale, quindi è possibile distinguere il lavoro di un frame da quello di un altro cercando gli spazi tra il lavoro della GPU attiva.

In alternativa, se hai dimestichezza con il lavoro inviato alla GPU, identificare il pattern dei passaggi di rendering inviati fornisce informazioni su quando inizia e termina un frame.

Uno screenshot di più frame eseguiti in sequenza.
Figura 9. Più frame eseguiti in sequenza.
Uno screenshot in cui l'IA generativa aumenta lo zoom sul lavoro di un singolo frame.
Figura 10. È stato aumentato lo zoom su un singolo fotogramma.

Per le app con un flusso di lavoro GPU più parallelizzato, puoi ottenere le durate frame della GPU cercando tutti i frame con lo stesso submissionID nel riquadro Selezione per ogni segmento.

Per le app basate su Vulkan, è possibile utilizzare più invii per comporre un frame. Tieni traccia degli ID di invio utilizzando il canale Eventi Vulkan, che contiene un'analisi per ogni invio. La selezione di un segmento di invio evidenzierà tutti i segmenti di attività della GPU corrispondenti all'invio.

Uno screenshot di un carico di lavoro della GPU parallelizzato, in cui il lavoro su un frame può sovrapporsi a un altro.
Figura 11. Un carico di lavoro della GPU parallelizzato, in cui il lavoro su un frame può sovrapporsi a un altro.


Uno screenshot di diversi eventi Vulkan selezionati per un frame.
Figura 12. Diversi eventi Vulkan selezionati per un frame.

Dispositivi Adreno

Sui dispositivi Adreno, i seggiolini della GPU vengono visualizzati nel canale Coda GPU 0 e sono sempre rappresentati in sequenza, quindi puoi esaminare tutti i seggiolini che rappresentano le pass di rendering per un frame e utilizzarli per misurare le durate dei frame della GPU.

Uno screenshot di più frame eseguiti in sequenza.
Figura 13. Più frame eseguiti in sequenza.
Uno screenshot in cui l'IA generata dall'IA è aumentata su un frame con più passaggi di rendering.
Figura 14. Zoom su un frame con più passaggi di rendering.

Analogamente allo scenario Mali descritto in precedenza: se l'app utilizza Vulkan, il canale Vulkan Events fornisce informazioni sul lavoro inviato per eseguire il frame. Per evidenziare le pass di rendering, fai clic sulle sezioni Eventi Vulkan associate al frame.

Uno screenshot di un'app basata su Vulkan in cui sono selezionati gli eventi Vulkan del frame.
Figura 15. Un'app basata su Vulkan in cui sono selezionati gli eventi Vulkan per un frame.

In alcuni casi, i confini dei frame della GPU sono più difficili da distinguere perché l'app è fortemente vincolata alla GPU. In questi scenari, se hai familiarità con il lavoro inviato alla GPU, puoi identificare il pattern con cui vengono eseguiti i passaggi di rendering e determinare i confini del frame da queste informazioni.

Uno screenshot di un'app con un'elevata dipendenza dalla GPU con un pattern di passaggio di rendering che aiuta a identificare i confini del frame.
Figura 16. Un'app con un'elevata dipendenza dalla GPU con un pattern di passaggio di rendering che aiuta a identificare i confini dei frame.

Contatori GPU

Se le informazioni sui seggi GPU non sono disponibili in una traccia, puoi stimare il tempo di frame della GPU utilizzando i canali Contatore GPU.

Dispositivi Mali

Sui dispositivi Mali, puoi utilizzare il monitoraggio dell'utilizzo della GPU per stimare il tempo di frame della GPU per un'app che non richiede un'intensa attività della GPU. Quando le app sono meno intensive per la GPU, presentano periodi regolari di attività GPU elevata e ridotta, anziché un'attività costantemente elevata. Per stimare i tempi di frame della GPU utilizzando il monitoraggio dell'utilizzo della GPU, misura la durata dei periodi di attività elevata nel monitoraggio.

Uno screenshot dei canali Utilizzo GPU e Coda GPU su un dispositivo Mali.
Figura 17. Monitora l'utilizzo della GPU e la coda della GPU su un dispositivo Mali.

Se l'app è più intensiva per la GPU, l'utilizzo della GPU può essere costantemente molto elevato. In questo caso, puoi utilizzare i canali Utilizzo coda frammenti e Utilizzo coda non frammenti per monitorare l'attività della GPU e stimare i tempi di frame della GPU. Cercando schemi nei canali fragment e non-fragment, puoi ottenere una stima approssimativa dei confini di un fotogramma e utilizzarla per misurare il tempo del fotogramma della GPU.

Uno screenshot dei canali con frammenti e senza frammenti.
Figura 18. Tracce con frammenti e senza frammenti.

Dispositivi Adreno

Sui dispositivi Adreno, se l'app non richiede un'elaborazione intensiva della GPU, puoi stimare i tempi di frame della GPU nello stesso modo in cui puoi farlo con i dispositivi Mali nella sezione precedente.

Uno screenshot della percentuale di utilizzo della GPU e delle tracce della coda della GPU su un dispositivo Adreno.
Figura 19. La percentuale di utilizzo della GPU e la coda della GPU su un dispositivo Adreno.

Se l'app è più intensiva per la GPU e l'applicazione ha una percentuale di utilizzo della GPU costantemente elevata, puoi utilizzare le tracce Istruzioni vertex/secondo e Istruzioni frammento / secondo per stimare i tempi di frame della GPU. Cercando schemi nei livelli di attività di questi canali, puoi ottenere una stima approssimativa dei confini di un frame e utilizzarla per misurare il tempo del frame della GPU.

Uno screenshot di Istruzioni Vertex / Secondo canale.
Figura 20. Il canale Istruzioni Vertex / secondo.

Questi altri canali potrebbero fornire informazioni simili:

  • Vertici ombreggiati / secondo
  • Frammenti ombreggiati / secondo
  • % vertici con ombreggiatura temporale
  • % frammenti di ombreggiatura del tempo