Save the date! Android Dev Summit is coming to Mountain View, CA on November 7-8, 2018.

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 como 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 na qual 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 poderá demorar mais para processar novos comandos e solicitar ao resto do sistema 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.

Observação: essa ferramenta de criação do perfil não funciona com aplicativos que usam o NDK. Isso ocorre porque o sistema envia mensagens de estrutura ao segundo plano sempre que o OpenGL assume um contexto de tela cheia. Nesses casos, você pode usar uma ferramenta de criação do perfil fornecida pelo fabricante da GPU.

Ativar o criador de perfil

Antes de começar, verifique se está usando um dispositivo executando 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 da renderização da GPU do dispositivo durante o uso do aplicativo, faça o seguinte:

  1. No dispositivo, vá para Settings e toque em Developer Options.
  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 On screen as bars 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:

  • Para cada aplicativo visível a ferramenta exibe um gráfico.
  • 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 sua 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 perfis 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 ficar alta, significa que o aplicativo está fazendo trabalho excessivo na GPU.
Command Issue Representa o tempo dispendido pelo renderizador 2D do Android 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 esta parte da barra ficar alta, indicará um possível excesso de desenho de visualizações personalizadas ou muito trabalho em métodos onDraw.
Measure/Layout Representa a quantidade de tempo dispendida 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 for grande, é possível que o aplicativo esteja usando um animador personalizado com desempenho inadequado ou que algum trabalho inesperado está 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. Se esse segmento for grande, indicará que o aplicativo está dispendendo muito tempo processando a entrada do usuário. Considere a transferência desse processamento para um encadeamento diferente.
Misc Time/VSync Delay Representa o tempo dispendido pelo aplicativo executando 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 componente no Android 6.0 ou posterior.

As versões do Android entre 4.0 (API de nível 14) e 5.0 (API de nível 21) têm um segmento 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 ficar alta, significa que o aplicativo está fazendo trabalho excessivo na GPU.
Execute Representa o tempo dispendido pelo renderizador 2D do Android 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 anterior.
Update Representa o tempo usado para criar e atualizar as listas de exibição da visualização. Se esta parte da barra ficar alta, indicará um possível excesso de desenho de visualizações personalizadas ou muito trabalho em métodos onDraw.

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

Para obter 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 acontece, 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, você deve 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 Settings e toque Developer Options.
  2. Role para baixo até a seção Hardware accelerated rendering e selecione Debug GPU Overdraw.
  3. Na caixa de diálogo Debug GPU overdraw, selecione Show overdraw areas.

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

  • Cor real: 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 ou mais 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 mostra, na maioria, cores reais ou excesso de renderização de apenas 1 vez (azul).

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