Estimar os tempos de processamento de frames da CPU e da GPU

Estimar os tempos de processamento de frames da CPU e da GPU (tempos de frame) é essencial para entender a performance do app e localizar gargalos. Ao criar o perfil de um app com o AGI, o System Profiler fornece dados de trace que podem ser usados para estimar os tempos de frame.

Tempos de CPU

No AGI, é possível conferir os tempos de frame totais e ativos da CPU na faixa da CPU de um perfil do sistema.

Tempo de CPU total

Para medir o tempo total gasto da CPU, selecione o período que inclui o tempo entre eventos de envio de frames sucessivos. Os eventos de envio de frames são eglSwapBuffers (para OpenGL) e vkQueuePresentKHR (para Vulkan).

Captura de tela de eventos eglSwapBuffer.
Figura 1. Tempo entre dois eventos eglSwapBuffer.


Captura de tela de um evento vkQueuePresentKHR.
Figura 2. Tempo entre dois eventos vkQueuePresentKHR.

Essa medição é uma estimativa do tempo total da CPU,mas não representa necessariamente o tempo ativo da CPU. Por exemplo, em apps vinculados à GPU, a CPU pode aguardar a conclusão do trabalho da GPU antes de enviar um novo frame. Isso geralmente acontece quando um evento dequeueBuffer, eglSwapBuffer (para OpenGL) ou vkQueuePresent (para Vulkan) ocupa uma grande parte do tempo da CPU. O tempo de espera é incluído no tempo total da CPU, mas não no tempo ativo da CPU.

Uma captura de tela que mostra uma grande quantidade de inatividade durante os eventos dequeueBuffer e eglSwapBuffer.
Figura 3. Grande quantidade de CPU ociosa durante dequeueBuffer e eglSwapBuffer eventos.

Tempo ativo da CPU

O tempo ativo da CPU determina quando a CPU está executando o código do app sem estar em estado ocioso.

Para medir o tempo ativo da CPU, confira as fatias Em execução logo acima dos eventos da CPU. Conte todas as partes do trace entre os dois eventos de envio de frames que estão no estado Em execução. Inclua linhas de execução de trabalho.

Uma captura de tela de dois períodos de tempo de CPU que podem ser usados para medir o tempo de CPU ativo.
Figura 5. Dois períodos de tempo da CPU que podem ser usados para medir o tempo ativo da CPU.


Uma captura de tela de um app multithread que tem outras linhas de execução em funcionamento enquanto a principal está inativa.
Figura 6. Um app multithread que tem outras linhas de execução de trabalho enquanto a linha de execução principal está ociosa.

Outra maneira de medir o tempo ativo da CPU é conferir as fatias do app nas faixas da CPU. Essas fatias indicam quando a CPU está em execução e correspondem às fatias Em execução.

Uma captura de tela que mostra o estado de execução de uma linha fixada que corresponde à faixa de CPU.
Figura 7. O estado de execução da linha de execução fixada corresponde à faixa da CPU.

Para ajudar a identificar fatias de apps, adicione ATrace marcadores ao seu app. Isso vai mostrar os marcadores na faixa da CPU do System Profiler.

Uma captura de tela de intervalos do ATrace mostrados em uma faixa de CPU.
Figura 8. Fatias ATrace mostradas em uma faixa da CPU.

Estimar tempos de frame da GPU

Para estimar os tempos de frame da GPU, use fatias ou contadores de GPU no System Profiler. A estimativa é mais precisa ao usar fatias de GPU.

Fatias de GPU

Se o System Profiler tiver informações de frações de GPU disponíveis, você poderá receber informações muito precisas sobre o tempo para a renderização do frame da GPU medindo o tempo total que o app gasta trabalhando em tarefas associadas a um único frame.

Dispositivos Mali

Em dispositivos Mali, as fatias de GPU têm faixas de fragmento, não fragmentadas e ocasionalmente não fragmentadas suplementares. Para frames menos complexos, o trabalho de fragmento e não fragmentado é sequencial. Portanto, é possível distinguir o trabalho de um frame de outro procurando lacunas entre o trabalho ativo da GPU.

Como alternativa, se você estiver familiarizado com o trabalho que está sendo enviado à GPU, identificar o padrão das passagens de renderização enviadas fornecerá informações sobre quando um frame começa e termina.

Uma captura de tela de vários frames sendo executados em sequência.
Figura 9. Vários frames sendo executados em sequência.
Uma captura de tela em que a AGI está ampliada no trabalho de um frame individual.
Figura 10. Zoom em um trabalho de frame individual.

Para apps que têm um fluxo de trabalho de GPU mais paralelizado, é possível acessar os tempos de frame da GPU procurando todos os frames que têm o mesmo submissionID no painel Seleção de cada fatia.

Para apps baseados em Vulkan, vários envios podem ser usados para compor um frame. Acompanhe os IDs de envio usando a faixa Eventos Vulkan, que contém uma fatia para cada envio. Selecionar uma fatia de envio vai destacar todas as fatias de atividade da GPU que correspondem ao envio.

Captura de tela de uma carga de trabalho de GPU paralela, em que o trabalho em um frame pode se sobrepor a outro.
Figura 11. Uma carga de trabalho de GPU paralelizada, em que o trabalho em um frame pode se sobrepor a outro.


Uma captura de tela de vários eventos do Vulkan selecionados para um frame.
Figura 12. Vários eventos Vulkan selecionados para um frame.

Dispositivos Adreno

Em dispositivos Adreno, as fatias de GPU aparecem na faixa GPU Queue 0 e são sempre representadas sequencialmente. Portanto, é possível conferir todas as fatias que representam as passagens de renderização de um frame e usá-las para medir os tempos de frame da GPU.

Uma captura de tela de vários frames sendo executados em sequência.
Figura 13. Vários frames sendo executados em sequência.
Uma captura de tela em que a AGI é ampliada em um frame com várias transmissões de renderização.
Figura 14. Zoom em um frame com várias passagens de renderização.

Semelhante ao cenário do Mali descrito anteriormente: se o app estiver usando o Vulkan, a faixa Eventos Vulkan vai fornecer informações sobre o trabalho enviado para executar o frame. Para destacar as passagens de renderização, clique nas fatias Eventos Vulkan associadas ao frame.

Captura de tela de um app baseado em Vulkan em que os eventos de frame do Vulkan estão selecionados.
Figura 15. Um app baseado em Vulkan em que os eventos Vulkan de um frame são selecionados.

Há alguns cenários em que os limites de frame da GPU são mais difíceis de distinguir devido ao app estar fortemente vinculado à GPU. Nesses cenários, se você estiver familiarizado com o trabalho enviado à GPU, poderá identificar o padrão com que as passagens de renderização estão sendo executadas e determinar os limites de frame dessas informações.

Captura de tela de um app fortemente vinculado à GPU com um padrão de transmissão de renderização que ajuda a identificar limites de frames.
Figura 16. Um app fortemente vinculado à GPU com um padrão de passagem de renderização que ajuda a identificar limites de frame.

Contadores de GPU

Se as informações de fatias de GPU não estiverem disponíveis em um trace, você poderá estimar o tempo para a renderização do frame da GPU usando as faixas do contador de GPU.

Dispositivos Mali

Em dispositivos Mali, é possível usar a faixa Utilização da GPU para estimar o tempo para a renderização do frame da GPU de um app que não é intensivo em GPU. Quando os apps são menos intensivos em GPU, eles têm períodos regulares de atividade alta e baixa da GPU, em vez de atividade consistentemente alta. Para estimar os tempos de frame da GPU usando a faixa Utilização da GPU, meça a duração dos períodos de alta atividade na faixa.

Uma captura de tela do uso da GPU e das faixas da fila da GPU em um dispositivo Mali.
Figura 17. As faixas de utilização da GPU e de fila da GPU em um dispositivo Mali.

Se o app for mais intensivo em GPU, a utilização da GPU poderá ser consistentemente muito alta. Nesse caso, é possível usar as faixas Utilização da fila de fragmentos e Utilização da fila não fragmentada para monitorar a atividade da GPU e estimar os tempos de frame da GPU. Ao procurar padrões nas faixas de fragmento e não fragmentadas , é possível ter uma estimativa aproximada de onde estão os limites de um frame e usá-la para medir o tempo para a renderização do frame da GPU.

Uma captura de tela de faixas com e sem fragmentos.
Figura 18. Faixas de fragmento e não fragmentadas.

Dispositivos Adreno

Em dispositivos Adreno, se o app não for intensivo em GPU, é possível estimar os tempos de frame da GPU da mesma forma que em dispositivos Mali na seção anterior.

Uma captura de tela da porcentagem de utilização da GPU e das faixas da fila da GPU em um dispositivo Adreno.
Figura 19. A porcentagem de utilização da GPU e as faixas de fila da GPU em um dispositivo Adreno.

Se o app for mais intensivo em GPU e tiver uma porcentagem de utilização da GPU consistentemente alta, use as faixas Instruções de vértice / segundo e Instruções de fragmento / segundo para estimar os tempos de frame da GPU. Ao procurar padrões nos níveis de atividade dessas faixas, é possível ter uma estimativa aproximada de onde estão os limites de um frame e usá-la para medir o tempo para a renderização do frame da GPU.

Uma captura de tela das instruções do Vertex / Segunda faixa.
Figura 20. A faixa Instruções de vértice / segundo.

Essas outras faixas podem fornecer informações semelhantes:

  • Vértices sombreados / segundo
  • Fragmentos sombreados / segundo
  • % de tempo de sombreamento de vértices
  • % de tempo de sombreamento de fragmentos