Usar: context.clearRect(0, 0, canvas.width, canvas.height);
Essa é a maneira mais rápida e descritiva de limpar a tela inteira.
Não use: canvas.width = canvas.width;
A redefinição canvas.width
redefine todo o estado da tela (por exemplo, transformações, lineWidth, strokeStyle etc.), é muito lento (comparado ao clearRect), não funciona em todos os navegadores e não descreve o que você está realmente tentando fazer.
Lidando com coordenadas transformadas
Se você modificou a matriz de transformação (por exemplo scale
, usando,, rotate
ou translate
), context.clearRect(0,0,canvas.width,canvas.height)
provavelmente não limpará toda a parte visível da tela.
A solução? Redefina a matriz de transformação antes de limpar a tela:
// Store the current transformation matrix
context.save();
// Use the identity matrix while clearing the canvas
context.setTransform(1, 0, 0, 1, 0, 0);
context.clearRect(0, 0, canvas.width, canvas.height);
// Restore the transform
context.restore();
Edit:
Acabei de fazer alguns perfis e (no Chrome) é 10% mais rápido para limpar uma tela de 300 x 150 (tamanho padrão) sem redefinir a transformação. À medida que o tamanho da sua tela aumenta, essa diferença diminui.
Isso já é relativamente insignificante, mas na maioria dos casos você estará atraindo consideravelmente mais do que está limpando e acredito que essa diferença de desempenho seja irrelevante.
100000 iterations averaged 10 times:
1885ms to clear
2112ms to reset and clear
clearRect
você precisa ter um contexto não transformado ou acompanhar seus limites reais.