Inspeção de telas usando o Chrome DevTools

Introdução

Não importa se você está usando um contexto 2D ou WebGL, qualquer pessoa que já trabalhou com o elemento <canvas> sabe que pode ser extremamente difícil depurar. Trabalhar com uma tela geralmente envolve uma lista longa e difícil de seguir de chamadas:

function draw() {

  context.clearRect(0, 0, 258, 258);
  context.fillStyle = "#EEEEEE";
  context.beginPath();
  context.arc(129, 129, 127, 0, 6.28, true);
  context.closePath();
  context.fill();

  // … and on and on
}

Às vezes, você quer capturar as instruções enviadas para um contexto da tela e seguir uma por uma. Felizmente, há um novo recurso de inspeção de tela no Chrome DevTools que permite fazer exatamente isso.

Neste artigo, vou mostrar como usar esse recurso para começar a depurar seu trabalho na tela. O inspetor oferece suporte a contextos 2D e WebGL. Portanto, não importa qual você está usando, você pode receber informações de depuração úteis imediatamente.

Primeiros passos

Para começar, acesse about:flags no Chrome e ative a opção "Ativar experimentos das Ferramentas para desenvolvedores".

Ativar os experimentos de Ferramentas para desenvolvedores em about:flags.
Figura 1: como ativar os experimentos das Ferramentas para desenvolvedores em about:flags

Em seguida, acesse DevTools e clique na engrenagem Ícone de roda dentada no canto inferior direito. A partir daí, você pode acessar Experimentos e ativar a Inspeção de tela:

Como ativar a inspeção do Canvas nos experimentos do DevTools
Figura 2: como ativar a inspeção de tela nos experimentos do DevTools

Para que as mudanças entrem em vigor, feche e abra novamente o DevTools. Você pode usar Alt+R ou Option+R, uma alternativa prática.

Quando o DevTools for aberto novamente, acesse a seção “Profiles” para ver uma nova opção do Canvas Profiler.

Para começar, o Canvas Profiler está desativado. Quando você tiver uma página com uma tela que quer depurar, pressione Enable. A página será atualizada, pronta para capturar as chamadas <canvas>:

Ativar o criador de perfil do Canvas
Figura 3: como ativar o Canvas Profiler

Você precisa decidir se quer capturar um único frame ou frames consecutivos, em que um frame é exatamente igual ao que você encontraria na linha do tempo dos DevTools.

Frame único captura as chamadas até o final do frame atual e é interrompida. Os frames consecutivos, por outro lado, capturam todos os frames de todos os elementos <canvas> até que você peça para interrompê-lo. O modo escolhido depende de como você usa o elemento <canvas>. Para uma animação em andamento, convém capturar um único frame. Para uma animação breve que ocorre em resposta a um evento do usuário, talvez seja necessário capturar frames consecutivos.

Como escolher quantos frames capturar
Figura 4: como escolher quantos frames capturar

Pronto, tudo está configurado e você já pode começar a capturar.

Como capturar frames

Para fazer a captura, basta pressionar Start e interagir com o aplicativo normalmente. Depois de algum tempo, volte para o DevTools e, se estiver capturando em sequência, pressione Stop.

Agora você tem um perfil novo na lista à esquerda, com o número de chamadas de contexto capturadas em todos os elementos <canvas>. Clique no perfil e você verá uma tela parecida com esta:

Um perfil de tela em DevTools.
Figura 5: um perfil de tela no DevTools

No painel inferior, você vai encontrar uma lista de todos os frames capturados que podem ser visualizados. Ao clicar em cada um deles, a captura de tela na parte de cima vai mostrar o estado do elemento <canvas> no final do frame. Se você tiver vários elementos <canvas>, poderá escolher qual deles será mostrado usando o menu logo abaixo da captura de tela.

Como escolher o contexto da tela.
Figura 6: como escolher o contexto da tela

Dentro do frame, você vai encontrar grupos de chamadas de desenho. Cada grupo de chamadas de desenho contém uma única chamada de desenho, que será a última chamada no grupo. O que é uma chamada de empate? Para um contexto 2D, seriam coisas como clearRect(), drawImage(), fill(), stroke(), putImageData() ou qualquer função de renderização de texto. Para o WebGL, seria clear(), drawArrays() ou drawElements(). É basicamente qualquer coisa que possa mudar o conteúdo do buffer de desenho atual. Se você não gosta de gráficos, pense em um buffer como um bitmap com pixels que estamos manipulando.

Agora você só precisa percorrer a lista. Você pode fazer isso no nível do frame, do grupo de chamadas de desenho ou da chamada. Seja qual for a forma que você escolher para percorrer a lista (e há botões logo abaixo da captura de tela que ajudam a navegar rapidamente), você vai encontrar o contexto naquele ponto, o que significa que você pode encontrar e corrigir rapidamente os bugs à medida que eles aparecem.

Botões de navegação para pular listas com facilidade.
Figura 7: botões de navegação para alternar entre listas com facilidade

Encontre a diferença

Outro recurso útil é a capacidade de ver quais propriedades e variáveis foram alteradas entre duas chamadas.

Clique no botão da barra lateral (Ícone da barra lateral.) para abrir uma nova visualização. Ao passar pelas chamadas de exibição, você vai notar as propriedades que foram atualizadas. Os buffers ou matrizes vão mostrar o conteúdo quando você passar o cursor sobre eles.

Encontre a diferença

Seja ouvido!

Agora você sabe como depurar seu trabalho de tela no DevTools do Chrome. Se você tiver feedback sobre a ferramenta Canvas Profiler, envie um bug ou faça uma publicação no grupo do Chrome DevTools. Informe se você encontrar bugs ou se há algo mais que gostaria de ver ao inspecionar um <canvas>, porque as ferramentas do Chrome só melhoram com o uso e o feedback dos desenvolvedores.