Uso: context.clearRect(0, 0, canvas.width, canvas.height);
Questo è il modo più rapido e descrittivo per cancellare l'intera tela.
Non usare: canvas.width = canvas.width;
Il ripristino canvas.width
ripristina tutto lo stato della tela (ad es. Trasformazioni, lineWidth, strokeStyle, ecc.), È molto lento (rispetto a clearRect), non funziona in tutti i browser e non descrive ciò che stai effettivamente cercando di fare.
Gestire le coordinate trasformate
Se è stato modificato la matrice di trasformazione (ad esempio utilizzando scale
, rotate
o translate
) quindi context.clearRect(0,0,canvas.width,canvas.height)
probabilmente non cancellare l'intera porzione visibile della tela.
La soluzione? Ripristina la matrice di trasformazione prima di cancellare l'area di disegno:
// 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();
Modifica:
ho appena fatto un po 'di profilazione e (in Chrome) è circa il 10% più veloce per cancellare una tela 300x150 (dimensione predefinita) senza ripristinare la trasformazione. Man mano che la dimensione della tela aumenta, questa differenza diminuisce.
Questo è già relativamente insignificante, ma nella maggior parte dei casi disegnerai molto più di quello che stai cancellando e credo che questa differenza di prestazioni sia irrilevante.
100000 iterations averaged 10 times:
1885ms to clear
2112ms to reset and clear
clearRect
è necessario disporre di un contesto non trasformato o tenere traccia dei limiti effettivi.