Використання: context.clearRect(0, 0, canvas.width, canvas.height);
Це найшвидший і описовий спосіб очистити все полотно.
Не використовувати: canvas.width = canvas.width;
Скидання canvas.width
скидає всі стани полотна (наприклад, перетворення, ширину рядка, 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
вас потрібно або мати непереформований контекст, або слідкувати за своїми фактичними межами.