Verwenden: context.clearRect(0, 0, canvas.width, canvas.height);
Dies ist der schnellste und aussagekräftigste Weg, um die gesamte Leinwand zu löschen.
Verwende nicht: canvas.width = canvas.width;
Durch das canvas.width
Zurücksetzen wird der gesamte Canvas-Status zurückgesetzt (z. B. Transformationen, Zeilenbreite, Strichstil usw.). Dies ist sehr langsam (im Vergleich zu clearRect), funktioniert nicht in allen Browsern und beschreibt nicht, was Sie tatsächlich versuchen.
Umgang mit transformierten Koordinaten
Wenn Sie die Transformationsmatrix geändert haben (zB mit scale
, rotate
oder translate
) , danncontext.clearRect(0,0,canvas.width,canvas.height)
wird wahrscheinlich nicht den gesamten sichtbaren Teil der Leinwand löschen.
Die Lösung? Setzen Sie die Transformationsmatrix zurück, bevor Sie die Zeichenfläche löschen:
// 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();
Bearbeiten:
Ich habe gerade ein Profil erstellt und (in Chrome) ist es ungefähr 10% schneller, eine Leinwand im Format 300 x 150 (Standardgröße) zu löschen, ohne die Transformation zurückzusetzen. Mit zunehmender Größe Ihrer Leinwand nimmt dieser Unterschied ab.
Das ist bereits relativ unbedeutend, aber in den meisten Fällen zeichnen Sie erheblich mehr als Sie löschen, und ich halte diesen Leistungsunterschied für irrelevant.
100000 iterations averaged 10 times:
1885ms to clear
2112ms to reset and clear
clearRect
Sie entweder einen nicht transformierten Kontext haben oder Ihre tatsächlichen Grenzen verfolgen müssen.