Sử dụng: context.clearRect(0, 0, canvas.width, canvas.height);
Đây là cách nhanh nhất và mô tả nhất để xóa toàn bộ khung vẽ.
Không được dùng: canvas.width = canvas.width;
Đặt canvas.width
lại tất cả các trạng thái canvas (ví dụ: biến đổi, lineWidth, StroStyle, v.v.), nó rất chậm (so với ClearRect), nó không hoạt động trong tất cả các trình duyệt và nó không mô tả những gì bạn đang thực sự làm.
Xử lý tọa độ biến đổi
Nếu bạn đã sửa đổi ma trận chuyển đổi (ví dụ sử dụng scale
, rotate
hoặc translate
) sau đó context.clearRect(0,0,canvas.width,canvas.height)
có thể sẽ không xóa toàn bộ phần hữu hình của canvas.
Giải pháp? Đặt lại ma trận chuyển đổi trước khi xóa khung vẽ:
// 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();
Chỉnh sửa:
Tôi vừa thực hiện một số lược tả và (trong Chrome), nhanh hơn khoảng 10% để xóa khung vẽ 300x150 (kích thước mặc định) mà không cần đặt lại biến đổi. Khi kích thước của khung vẽ của bạn tăng sự khác biệt này giảm xuống.
Điều đó đã tương đối không đáng kể, nhưng trong hầu hết các trường hợp, bạn sẽ vẽ nhiều hơn đáng kể so với bạn đang xóa và tôi tin rằng sự khác biệt hiệu suất này là không liên quan.
100000 iterations averaged 10 times:
1885ms to clear
2112ms to reset and clear
clearRect
bạn cần phải có một bối cảnh chưa được xử lý hoặc theo dõi các ranh giới thực tế của bạn.