Depurar instabilidade de animação

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.

Renderizar no ChromeOS

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 demorar muito, o resultado renderizado não estará pronto para a próxima troca de buffer e, consequentemente, o frame anterior será repetido.

Então, o renderizador não poderá começar a renderizar o próximo frame, causando ainda mais problemas. Esse cenário é familiar para os desenvolvedores de dispositivos móveis Android. Quando um app é executado no ChromeOS, o contexto é ainda mais complicado.

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 pode não ser 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 entre o momento em que um frame é renderizado e o momento em que ele aparece na tela. Dependendo do hardware, o sistema pode usar buffer quádruplo para compensar. Mesmo com o armazenamento em buffer mais profundo, o pipeline gráfico ainda pode apresentar falhas.

ARC graphics tracer

O ChromeOS tem 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 o aplicativo está fazendo em determinado momento, conforme mostrado na imagem:

Configurar o criador de perfil

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

Antes de usar o criador de perfil, propague o app com rastros. Adicione Trace.traceCounter(Trace.TRACE_TAG_GRAPHICS, "Event", <number>); ao seu código sempre que quiser incluir um rastro. Use um Event que comece com o prefixo customTrace. O prefixo não aparece 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. Selecione Stop on jank.
  2. Execute o app para Android.
  3. Quando o app para Android estiver ativo e em foco, pressione Ctrl+Shift+G.

Quando ocorre alguma instabilidade, uma janela do navegador aparece. Use as teclas W e S para ampliar e reduzir a linha do tempo.