ใช้: context.clearRect(0, 0, canvas.width, canvas.height);
นี่เป็นวิธีที่เร็วและเป็นคำอธิบายที่ชัดเจนที่สุดในการล้างผืนผ้าใบทั้งหมด
ไม่ได้ใช้: canvas.width = canvas.width;
การรีเซ็ตcanvas.width
รีเซ็ตสถานะ Canvas ทั้งหมด (เช่นการแปลง, LineWidth, strokeStyle ฯลฯ ) มันช้ามาก (เมื่อเทียบกับ clearRect) มันไม่ทำงานในเบราว์เซอร์ทั้งหมดและไม่ได้อธิบายสิ่งที่คุณพยายามทำจริง ๆ
การจัดการกับพิกัดที่ถูกแปลง
หากคุณมีการแก้ไขเปลี่ยนแปลงเมทริกซ์ (เช่นใช้scale
, rotate
หรือtranslate
) แล้วcontext.clearRect(0,0,canvas.width,canvas.height)
อาจจะไม่ชัดเจนส่วนที่มองเห็นทั้งหมดของผืนผ้าใบ
การแก้ไขปัญหา? รีเซ็ตเมทริกซ์การแปลงก่อนที่จะล้างผืนผ้าใบ:
// 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();
แก้ไข:
ฉันเพิ่งเสร็จสิ้นการทำโปรไฟล์และ (ใน Chrome) มันเร็วกว่าประมาณ 10% ในการล้างผืนผ้าใบขนาด 300x150 (ขนาดเริ่มต้น) โดยไม่ต้องรีเซ็ตการแปลง เมื่อขนาดของผ้าใบเพิ่มความแตกต่างนี้จะลดลง
นั่นเป็นเรื่องที่ค่อนข้างไม่มีนัยสำคัญ แต่ในกรณีส่วนใหญ่คุณจะวาดภาพได้มากกว่าที่คุณกำลังเคลียร์และฉันเชื่อว่าความแตกต่างด้านประสิทธิภาพนี้ไม่เกี่ยวข้อง
100000 iterations averaged 10 times:
1885ms to clear
2112ms to reset and clear
clearRect
คุณต้องมีบริบทที่ไม่ได้เปลี่ยนรูปแบบหรือติดตามขอบเขตจริงของคุณ