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).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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