Depuração de instabilidades de animações

Um dos problemas mais difíceis para os desenvolvedores de apps é garantir uma animação suave, sem falhas e instabilidades. Isso é especialmente difícil de depurar quando o sistema também está realizando tarefas em segundo plano que consomem muitos recursos. Não há uma maneira fácil de determinar se alguma instabilidade é causada pelo app ou pelo sistema. No entanto, há uma ferramenta de criação de perfil que pode ajudar a identificar a possível origem do mau comportamento.

Renderização no Chrome OS

Um app bem ajustado, como um jogo, geralmente usa buffer duplo para manter o menor tempo de resposta do usuário possível. Ainda assim, há muitos fatores que podem prejudicar o desempenho. Por exemplo, se a renderização de um frame for muito demorada, o resultado não estará pronto para a próxima troca de buffer e, assim, o frame anterior será repetido. Então, o renderizador não poderá começar a processar o frame seguinte, causando ainda mais problemas. Esse cenário é bastante conhecido para os desenvolvedores que trabalham exclusivamente com o Android. Quando um app é executado no Chrome OS, o contexto fica ainda mais complexo.

Um app em execução no computador não é renderizado diretamente no frame de exibição da tela. Em vez disso, os dados são renderizados em uma textura. Normalmente, há vários apps, sendo que cada um renderiza os próprios elementos gráficos em uma textura. O sistema constrói a visualização na tela usando um compositor para combinar todas as texturas em uma única imagem no computador.

O compositor funciona de maneira transparente em segundo plano. No entanto, ele introduz um atraso no tempo para a renderização do frame a fim de maximizar o uso do pipeline da GPU. Em condições ideais, isso não é necessário, mas suaviza as flutuações de desempenho do sistema e ajuda a equilibrar uma carga assimétrica.

Quando o SO trabalha muito, a GPU pode ficar sobrecarregada. Pode haver um atraso extra entre o momento em que um frame é renderizado e o momento em que ele aparece na tela. Dependendo do hardware, o sistema pode usar um buffer quádruplo para compensar esse cenário. Mesmo com o armazenamento em buffer mais profundo, o pipeline gráfico ainda pode falhar.

ARC graphics tracer

O Chrome OS conta com uma ferramenta de criação de perfil que mostra como os buffers passam pelo sistema, quando ocorrem trocas de memória, qual é o nível de ocupação da CPU/GPU e o que seu aplicativo está fazendo em determinado momento:

Configurar o criador de perfil

Para usar o criador de perfil, execute o M75 ou mais recente. Para melhores resultados, recomendamos o uso de um dispositivo Intel.

Antes de usar o criador de perfil, você precisa propagar seu app com rastros. Adicione Trace.traceCounter(Trace.TRACE_TAG_GRAPHICS, "Event", <number>); ao seu código sempre que quiser incluir um rastro. O Event que você usa precisa começar com o prefixo customTrace.. Esse prefixo não aparecerá na mensagem de rastro.

Para configurar o criador de perfil, siga estas etapas:

  1. Ative o modo de desenvolvedor.
  2. Ative as configurações do Chrome e a ferramenta de visualização de buffers gráficos do ARC.
  3. Navegue para chrome://arc-graphics-tracing.

Executar o criador de perfil

  1. Verifique a opção stop on jank.
  2. Execute o app para Android.
  3. Quando o app para Android estiver ativo e com foco, pressione Ctrl+Shift+G.

Se houver alguma instabilidade, a janela do navegador será exibida como pop-up. Use as teclas w e s para aumentar e diminuir o zoom da linha do tempo.