Posługiwać się: context.clearRect(0, 0, canvas.width, canvas.height);
Jest to najszybszy i najbardziej opisowy sposób na wyczyszczenie całego obszaru roboczego.
Nie używaj: canvas.width = canvas.width;
Resetowanie canvas.width
resetuje cały stan obszaru roboczego (np. Transformacje, lineWidth, strokeStyle itp.), Jest bardzo wolny (w porównaniu do clearRect), nie działa we wszystkich przeglądarkach i nie opisuje tego, co tak naprawdę próbujesz zrobić.
Radzenie sobie z transformowanymi współrzędnymi
Jeśli zmodyfikowałeś macierz transformacji (np. Używając scale
, rotate
lub translate
) context.clearRect(0,0,canvas.width,canvas.height)
, prawdopodobnie nie wyczyści całej widocznej części obszaru roboczego.
Rozwiązanie? Zresetuj macierz transformacji przed wyczyszczeniem kanwy:
// 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();
Edycja:
Właśnie przeprowadziłem profilowanie i (w Chrome) jest około 10% szybsze wyczyszczenie obszaru roboczego 300 x 150 (domyślny rozmiar) bez resetowania transformacji. Wraz ze wzrostem rozmiaru płótna różnica ta spada.
Jest to już stosunkowo mało znaczące, ale w większości przypadków będziesz rysować znacznie więcej niż to, co robisz, i uważam, że ta różnica w wydajności nie ma znaczenia.
100000 iterations averaged 10 times:
1885ms to clear
2112ms to reset and clear
clearRect
że musisz mieć nieprzetworzony kontekst lub śledzić swoje rzeczywiste granice.