Utilizar: context.clearRect(0, 0, canvas.width, canvas.height);
Esta es la forma más rápida y descriptiva de borrar todo el lienzo.
No utilice: canvas.width = canvas.width;
El restablecimiento canvas.width
restablece todos los estados del lienzo (por ejemplo, transformaciones, ancho de línea, estilo de trazo, etc.), es muy lento (en comparación con clearRect), no funciona en todos los navegadores y no describe lo que realmente está intentando hacer.
Manejo de coordenadas transformadas
Si ha modificado la matriz de transformación (por ejemplo scale
, usando , rotate
o translate
), entonces context.clearRect(0,0,canvas.width,canvas.height)
probablemente no borrará toda la parte visible del lienzo.
¿La solución? Restablezca la matriz de transformación antes de limpiar el lienzo:
// 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();
Editar:
Acabo de hacer algunos perfiles y (en Chrome) es aproximadamente un 10% más rápido borrar un lienzo de 300x150 (tamaño predeterminado) sin restablecer la transformación. A medida que aumenta el tamaño de su lienzo, esta diferencia disminuye.
Eso ya es relativamente insignificante, pero en la mayoría de los casos obtendrá mucho más de lo que está limpiando y creo que esta diferencia de rendimiento es irrelevante.
100000 iterations averaged 10 times:
1885ms to clear
2112ms to reset and clear
clearRect
debe tener un contexto no transformado o realizar un seguimiento de sus límites reales.