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 renderização) é essencial para entender a performance do app e localizar gargalos. Ao criar um perfil para um app com o AGI, o System Profiler fornece dados de rastreamento que podem ser usados para estimar os tempos para a renderização do frame.

Tempos de CPU

No AGI, é possível conferir o tempo total e ativo para a renderização do frame da CPU na faixa de CPU de um perfil do sistema.

Tempo de CPU total

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

Captura de tela de vários eventos eglSwapBuffer.
Figura 1. Vários eventos de eglSwapBuffer.


Uma captura de tela de um evento vkQueuePresentKHR.
Figura 2. Um evento vkQueuePresentKHR.

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

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

Tempo de CPU ativo

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

Para medir o tempo de CPU ativo, veja as frações Running logo acima dos eventos da CPU. Conte todas as partes do trace entre os dois eventos de envio de frame que estão no estado Running. Inclua linhas de execução que funcionem.

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 de CPU que podem ser usados para medir o tempo de CPU ativo.


Captura de tela de um app com várias linhas de execução que tem uma linha em funcionamento enquanto a principal está inativa.
Figura 6. Um app com várias linhas de execução que tem uma linha em funcionamento enquanto a principal está inativa.

Outra maneira de medir o tempo de CPU ativo é visualizar as frações do app nas faixas da CPU. Essas frações indicam quando a CPU está em execução e correspondem às frações Running.

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

Para ajudar a identificar frações do app, você pode adicionar marcadores ATrace a ele. Os marcadores serão exibidos na faixa da CPU do System Profiler.

Captura de tela de um marcador ATrace em uma faixa da CPU.
Figura 8. Um marcador ATrace em uma faixa da CPU.

Estimar tempos de renderização de frames da GPU

Para estimar os tempos de renderização de frames da GPU, você pode usar frações ou contadores de GPU no System Profiler. A estimativa é mais precisa com o uso de frações da GPU.

Slices de GPU

Se o System Profiler tiver informações de fração da GPU disponíveis, você poderá receber informações muito precisas do 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 frações da GPU têm faixas fragmento, não fragmento e, às vezes, não fragmentos. Para frames menos complexos, o trabalho com fragmentos e que não são fragmentos é sequencial. Assim, é possível distinguir entre o trabalho de um frame e outro procurando lacunas entre o trabalho de GPU ativo.

Como alternativa, se você estiver familiarizado com o trabalho que está sendo enviado à GPU, identificar o padrão dos passes de renderização enviados fornece 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.
Captura de tela em que o AGI é ampliado no trabalho de um frame individual.
Figura 10. Mais zoom no trabalho de um frame individual.

Em apps que têm um fluxo de trabalho de GPU com mais carregamento em paralelo, é possível conseguir os tempos de frame da GPU procurando todos os frames que tenham o mesmo submissionID no painel Selection para cada fração.

Para apps baseados em Vulkan, vários envios podem ser usados para compor um frame. Acompanhe os IDs de envio usando a faixa Vulkan Events, que contém uma fração para cada envio. A seleção de uma fração de envio vai destacar todas as frações de atividade da GPU que correspondem ao envio.

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


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

Dispositivos Adreno

Em dispositivos Adreno, as frações da GPU aparecem na faixa Fila de GPU 0 e são sempre representadas sequencialmente. Assim, é possível analisar todas as frações que representam as transmissões de renderização de um frame e usá-las para medir os tempos de renderização de frames 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.
Captura de tela em que o AGI aumentou o zoom em um frame com várias transmissões de renderização.
Figura 14. Com zoom aumentado em um frame com vários passes de renderização.

Assim como o cenário em Mali descrito anteriormente: se o app estiver usando Vulkan, a faixa de Vulkan Events fornecerá informações sobre o trabalho que está sendo enviado para executar o frame. Para destacar os passes de renderização, clique nas fatias Vulkan Events associadas ao frame.

Uma captura de tela de um app baseado em Vulkan com eventos de Vulkan para um frame selecionado.
Figura 15. Um app baseado em Vulkan com eventos Vulkan para um frame selecionado.

Há alguns cenários em que os limites de frames da GPU são mais difíceis de distinguir devido ao app ser muito vinculado à GPU. Nesses cenários, se você estiver familiarizado com o trabalho que está sendo enviado à GPU, será possível identificar o padrão com que os cartões de renderização estão sendo executados e determinar os limites do frame a partir dessas informações.

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

Contadores de GPU

Se as informações de fração da GPU não estiverem disponíveis em um trace, será possível estimar o tempo de renderização do frame da GPU usando as faixas do contador de GPU.

Dispositivos Mali

Em dispositivos Mali, você pode usar a faixa Utilização de GPU para estimar o tempo de frame da GPU para um app que não use muita GPU. Quando os apps usam menos 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 renderização de frames da GPU usando a faixa de uso de GPU, meça a duração dos períodos de atividade intensa na faixa.

Uma captura de tela do uso da GPU e das faixas da fila da GPU em um dispositivo Mali.
Figura 17. O uso da GPU e as faixas da fila da GPU em um dispositivo Mali.

Se o app fizer mais uso de GPU, você pode usar as faixas fragment e não fragmento para estimar os tempos de renderização de frames da GPU. Ao procurar padrões nos níveis de atividade das faixas fragmento e não fragmento, é possível ter uma estimativa aproximada de onde estão os limites de um frame e usar isso para medir o tempo de renderização de frames da GPU.

Captura de tela de faixas com e sem fragmentos.
Figura 18. Fragment e non-fragment.

Dispositivos Adreno

Em dispositivos Adreno, se o app não fizer uso de muita GPU, você poderá estimar os tempos de frame da GPU da mesma forma que faria com os dispositivos Mali na seção anterior.

Captura de tela do uso da GPU e das faixas da fila da GPU em um dispositivo Adreno.
Figura 19. O uso da GPU e as faixas da fila da GPU em um dispositivo Adreno.

Se o app exigir mais uso da GPU, use as faixas Instruções da Vertex / segundo e Instruções do 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 de renderização de frames da GPU.

Uma captura de tela da faixa de instruções Vertex / Segunda.
Figura 20. Faixa Instruções da Vertex / Segunda.

Essas outras trilhas podem fornecer informações semelhantes:

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