Inspecionar velocidade e excesso de renderização da GPU

O Android inclui algumas opções do desenvolvedor no dispositivo que ajudam a visualizar onde o aplicativo pode encontrar problemas na renderização da IU, como a execução de mais trabalho de renderização que o necessário ou a execução de operações longas de encadeamento e GPU. Esta página descreve como depurar o excesso de renderização da GPU e a criação do perfil da renderização de GPU.

Para saber mais sobre as opções do desenvolvedor no dispositivo, incluindo a forma de ativá-las, leia Configurar opções do desenvolvedor no dispositivo.

Velocidade da criação do perfil de renderização de GPU

A ferramenta Criação do perfil de renderização de GPU exibe em um histograma com rolagem uma representação visual de quanto tempo é necessário para renderizar os quadros de uma janela de IU em relação a uma referência de 16 ms por quadro.

Em GPUs menos poderosas, a taxa de preenchimento (a velocidade em que a GPU pode preencher o buffer do quadro) pode ser muito baixa. À medida que cresce o número de pixels necessários para desenhar um quadro, a GPU pode demorar mais para processar novos comandos e solicitar que o resto do sistema aguarde até conseguir concluir a atividade. A ferramenta de criação do perfil ajuda a identificar quando a GPU fica sobrecarregada tentando desenhar pixels ou por grande excesso de renderização.

Ativar o criador de perfil

Antes de começar, verifique se está usando um dispositivo executando o Android 4.1 (API de nível 16) ou posterior e se ativou as opções do desenvolvedor. Para começar a criação do perfil de renderização da GPU do dispositivo durante o uso do aplicativo, faça o seguinte:

  1. No dispositivo, vá para Configurações e toque em Opções do desenvolvedor.
  2. Na seção Monitoramento, selecione Criação do perfil de renderização de GPU.
  3. Na caixa de diálogo Criação do perfil de renderização de GPU, escolha Na tela em barras para sobrepor os gráficos na tela do dispositivo.
  4. Abra o aplicativo para o qual você quer criar o perfil.

Inspecionar a saída

Na imagem ampliada do gráfico da Criação do perfil de renderização de GPU, mostrada na figura 1, você pode ver a seção colorida como exibida no Android 6.0 (API de nível 23).

Figura 1. Gráfico ampliado da Criação do perfil de renderização de GPU.

Veja a seguir algumas observações sobre a saída:

  • A ferramenta exibe um gráfico para cada aplicativo visível.
  • Cada barra vertical ao longo do eixo horizontal representa um quadro. A altura de cada barra vertical representa a quantidade de tempo necessária para a renderização do quadro (em milissegundos).
  • A linha verde horizontal representa 16 milissegundos. Para alcançar 60 quadros por segundo, a barra vertical de cada quadro precisa estar acima dessa linha. A qualquer momento que uma barra ultrapassar essa linha, poderão ocorrer pausas nas animações.
  • A ferramenta destaca quadros que excederam o limite de 16 milissegundos aumentando a largura da barra e reduzindo a transparência.
  • Cada barra tem componentes coloridos que são mapeados a uma etapa no pipeline de renderização. O número de componentes varia de acordo com o nível de API do dispositivo.

A tabela a seguir oferece descrições de cada segmento de uma barra vertical na saída do criador de perfil ao usar um dispositivo executando Android 6.0 ou posterior.

Componente da barraEtapa de renderizaçãoDescrição
Swap Buffers Representa o tempo que a CPU aguarda para que a GPU conclua seu trabalho. Se essa barra fica alta, isso significa que o aplicativo está fazendo trabalho excessivo na GPU.
Command Issue Representa o tempo que o renderizador 2D do Android leva para emitir comandos para que o OpenGL desenhe e redesenhe listas de exibição. A altura dessa barra é diretamente proporcional à soma do tempo necessário para a execução de cada lista de exibição. Mais listas de exibição equivalem a uma barra vermelha mais alta.
Sync & Upload Representa o tempo necessário para fazer upload das informações de bitmap para a GPU. Um segmento grande indica que o aplicativo está passando um tempo considerável carregando grandes quantidades de gráficos.
Draw Representa o tempo usado para criar e atualizar as listas de exibição da visualização. Se essa parte da barra fica alta, isso indica um possível excesso de desenho de visualizações personalizadas ou muito trabalho em métodos onDraw.
Measure/Layout Representa o tempo gasto em retornos de chamada OnLayout e onMeasure na hierarquia de visualização. Um segmento grande indica que o processamento da hierarquia de visualização está demorando muito.
Animation Representa o tempo necessário para avaliar todos os animadores que estavam sendo executados nesse quadro. Se esse segmento estiver grande, é possível que o aplicativo esteja usando um animador personalizado com desempenho inadequado ou que algum trabalho inesperado esteja ocorrendo como resultado da atualização de propriedades.
Input Handling Representa o tempo dispendido pelo aplicativo executando código dentro de um retorno de chamada de evento de entrada. Um segmento grande indica que o aplicativo está levando muito tempo para processar a entrada do usuário. Considere a transferência desse processamento para um encadeamento diferente.
Misc Time/VSync Delay Representa o tempo que o aplicativo leva para executar operações entre dois quadros consecutivos. Pode ser um indicador de excesso de processamento no encadeamento de IU, que poderia ser transferido para um encadeamento diferente.

Tabela 1. Barras de componentes no Android 6.0 e versões posteriores.

As versões do Android entre 4.0 (API de nível 14) e 5.0 (API de nível 21) têm segmentos azul, roxo, vermelho e laranja. As versões do Android abaixo de 4.0 têm apenas componentes azul, vermelho e laranja. A tabela a seguir mostra as barras de componentes no Android 4.0 e 5.0.

Componente da barraEtapa de renderizaçãoDescrição
Process Representa o tempo que a CPU aguarda para que a GPU conclua seu trabalho. Se essa barra fica alta, isso significa que o aplicativo está fazendo trabalho excessivo na GPU.
Execute Representa o tempo que o renderizador 2D do Android leva para emitir comandos para que o OpenGL desenhe e redesenhe listas de exibição. A altura dessa barra é diretamente proporcional à soma do tempo necessário para a execução de cada lista de exibição. Mais listas de exibição equivalem a uma barra vermelha mais alta.
XFer Representa o tempo necessário para fazer upload das informações de bitmap para a GPU. Um segmento grande indica que o aplicativo está passando um tempo considerável carregando grandes quantidades de gráficos. Esse segmento não é visível em dispositivos executando o Android 4.0 ou versões anteriores.
Update Representa o tempo usado para criar e atualizar as listas de exibição da visualização. Se essa parte da barra fica alta, isso indica um possível excesso de desenho de visualizações personalizadas ou muito trabalho em métodos onDraw.

Tabela 2. Barras de componentes no Android 4.0 e 5.0.

Para mais informações sobre como interpretar as informações fornecidas pela ferramenta de criação do perfil, leia Análise com Criação do perfil de renderização de GPU.

Observação: na verdade, embora esta ferramenta seja denominada Criação do perfil de renderização de GPU, todos os processos monitorados ocorrem na CPU. A renderização ocorre mediante o envio de comandos para a GPU, que gera a tela de forma assíncrona. Em algumas situações, a GPU pode ter muito trabalho para fazer, e a CPU terá de aguardar antes de enviar novos comandos. Quando isso acontecer, você verá picos nas barras laranja e vermelha, e o envio de comandos será bloqueado até que mais espaço seja liberado na fila de comandos da GPU.

Visualizar o excesso de renderização da GPU

Outro recurso nas opções do desenvolvedor ajuda a identificar o excesso de renderização codificando a IU em cores. O excesso de renderização ocorre quando o aplicativo desenha o mesmo pixel mais de uma vez no mesmo quadro. Dessa forma, essa visualização mostra onde o aplicativo pode estar executando mais trabalho de renderização que o necessário, o que pode ser um problema de desempenho devido ao esforço extra da GPU para renderizar pixels que não ficarão visíveis para o usuário. Portanto, é preciso corrigir eventos de excesso de renderização sempre que possível.

Se você ainda não ativou as opções do desenvolvedor, ative-as agora. Em seguida, para visualizar o excesso de renderização no dispositivo, faça o seguinte:

  1. No dispositivo, vá para Configurações e toque em Opções do desenvolvedor.
  2. Role para baixo até a seção Renderização acelerada por hardware e selecione Depurar overdraw da GPU.
  3. Na caixa de diálogo Depurar overdraw da GPU, selecione Mostrar áreas de overdraw.

O Android colore os elementos de IU para identificar o volume de excesso de renderização da seguinte forma:

  • Cor verdadeira: sem excesso de renderização
  • Azul: excesso de renderização (1 vez)
  • Verde: excesso de renderização (2 vezes)
  • Rosa: excesso de renderização (3 vezes)
  • Vermelho: excesso de renderização (4 vezes)

Figura 2. Um aplicativo exibido da forma normal (esquerda) e com excesso de renderização de GPU ativado (direita)

Observe que essas cores são semitransparentes. Portanto, a cor exata visualizada na tela depende do conteúdo da IU.

Agora que você pode reconhecer onde ocorre o excesso de renderização no layout, leia como reduzir o excesso de renderização.

Lembre-se de que algum excesso de renderização é inevitável. À medida que você ajusta a interface do usuário do aplicativo, tente conseguir uma visualização que mostre, na maioria, cores reais ou excesso de renderização de apenas 1 vez (azul).

Figura 3. Exemplos de um aplicativo com excesso de renderização (esquerda) e muito menos excesso de renderização (direita)