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 o desempenho do app e localizar gargalos. Quando você cria um perfil de um app com o AGI, o System Profiler fornece dados de rastreamento que podem ser usados para estimar os tempos de frame.

Tempos de CPU

No AGI, você pode conferir os tempos de frame total e ativo da CPU na faixa da CPU de um perfil do sistema.

Tempo total de CPU

Para medir o tempo total gasto pela 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 dos 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 esperar que a GPU conclua o trabalho antes de enviar um novo frame. Isso acontece com frequência 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 de CPU, mas não no tempo ativo de CPU.

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

Tempo de CPU ativo

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

Para medir o tempo de CPU ativo, confira os segmentos Running logo acima dos eventos de CPU. Conte todas as partes do rastro entre os dois eventos de envio de frame que estão no estado Running. 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 ativo da CPU.
Figura 5. Dois períodos de tempo de CPU que podem ser usados para medir o tempo de CPU ativo.


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

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

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

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

Uma captura de tela de fatias do ATrace mostradas em uma faixa de CPU.
Figura 8. Fatias do ATrace mostradas em uma faixa de CPU.

Estimar os tempos de frame da GPU

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

Fatias de GPU

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

Dispositivos Mali

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

Como alternativa, se você conhece o trabalho que está sendo enviado para a GPU, identificar o padrão das transmissões de renderização enviadas 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.
Uma captura de tela em que o AGI está ampliado no trabalho de um frame individual.
Figura 10. Aumentou o zoom em um frame individual.

Para apps com um fluxo de trabalho de GPU mais paralelizado, é possível conferir os tempos de frame da GPU procurando todos os frames com o mesmo ID de envio no painel Seleção para 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 Vulkan Events, que contém uma fatia para cada envio. A seleção de 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 paralela, em que o trabalho em um frame pode se sobrepor a outro.


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

Dispositivos Adreno

Em dispositivos Adreno, as fatias da GPU aparecem na faixa GPU Queue 0 e são sempre representadas sequencialmente. Assim, você pode analisar todas as fatias que representam as transmissões 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 o AGI está ampliado em um frame com várias passagens de renderização.
Figura 14. Aumentou o zoom em um frame com vários passes de renderização.

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

Captura de tela de um app baseado no Vulkan em que os eventos de frame do Vulkan estão selecionados.
Figura 15. Um app baseado em Vulkan em que os eventos do Vulkan para 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 fato de o app estar fortemente vinculado à GPU. Nesses cenários, se você conhece o trabalho que está sendo enviado para a GPU, pode identificar o padrão com que as transmissões de renderização estão sendo executadas e determinar os limites do frame com base nessas informações.

Uma captura de tela de um app com muita vinculação à 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 renderização que ajuda a identificar os limites do frame.

Contadores de GPU

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

Dispositivos Mali

Em dispositivos Mali, use a faixa Utilização da GPU para estimar o tempo de frame da GPU de um app que não usa muito a 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 Uso da GPU, meça a duração dos períodos de alta atividade na faixa.

Uma captura de tela das faixas de uso e fila da GPU em um dispositivo Mali.
Figura 17. A utilização da GPU e a fila da GPU são rastreadas em um dispositivo Mali.

Se o app exigir mais da GPU, a utilização dela poderá ser consistentemente muito alta. Nesse caso, é possível usar as faixas fragment queue utilization e non-fragment queue utilization para monitorar a atividade da GPU e estimar os tempos de frame da GPU. Ao procurar padrões em faixas fragment e não fragment, é possível ter uma estimativa aproximada de onde estão os limites de um frame e usá-la para medir o tempo de frame da GPU.

Captura de tela de faixas de fragmento e não fragmento.
Figura 18. Faixas fragmentadas e não fragmentadas.

Dispositivos Adreno

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

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

Se o app exigir mais da GPU e tiver uma porcentagem de uso da GPU consistentemente alta, use as faixas Vertex Instructions / Second e Fragment Instructions / Second para estimar os tempos de frame da GPU. Ao procurar padrões nos níveis de atividade dessas faixas, você pode ter uma estimativa aproximada de onde estão os limites de um frame e usá-la para medir o tempo de frame da GPU.

Captura de tela da faixa Vertex Instructions / Second.
Figura 20. A faixa Vertex Instructions / Second.

Essas outras faixas podem fornecer informações semelhantes:

  • Vertices sombreados / segundo
  • Fragments Shaded / Second
  • % de tempo de sombreamento de vértices
  • % de tempo de sombreamento de fragmentos