Josh đã hỏi (một lúc trở lại) về cách trình duyệt biết "khi nào quá trình vẽ kết thúc" để tránh nhấp nháy. Tôi đã bình luận trực tiếp vào bài đăng của anh ấy nhưng đại diện của tôi không đủ cao. Ngoài ra đây chỉ là ý kiến của tôi. Tôi không có dữ kiện để sao lưu nó, nhưng tôi cảm thấy khá tự tin về nó và nó có thể hữu ích cho những người khác khi đọc nó trong tương lai.
Tôi đoán rằng trình duyệt không "biết" khi bạn vẽ xong. Nhưng cũng giống như hầu hết các javascript, miễn là mã của bạn chạy mà không chuyển giao quyền kiểm soát cho trình duyệt, trình duyệt về cơ bản bị khóa và sẽ không / không thể cập nhật / phản hồi giao diện người dùng của nó. Tôi đoán rằng nếu bạn xóa canvas và vẽ toàn bộ khung của mình mà không từ bỏ quyền kiểm soát cho trình duyệt, nó sẽ không thực sự vẽ canvas của bạn cho đến khi bạn hoàn thành.
Nếu bạn thiết lập một tình huống trong đó kết xuất của bạn kéo dài nhiều lệnh gọi setTimeout / setInterval / requestAnimationFrame, trong đó bạn xóa canvas trong một lần gọi và vẽ các phần tử trên canvas của mình trong một số lần gọi tiếp theo, lặp lại chu kỳ (ví dụ) sau mỗi 5 lần gọi, tôi sẵn sàng cá rằng bạn sẽ thấy nhấp nháy vì canvas sẽ được cập nhật sau mỗi cuộc gọi.
Điều đó nói rằng, tôi không chắc mình sẽ tin tưởng điều đó. Chúng tôi đã ở điểm mà javascript được biên dịch thành mã máy gốc trước khi thực thi (ít nhất đó là những gì động cơ V8 của Chrome thực hiện theo những gì tôi hiểu). Tôi sẽ không ngạc nhiên nếu không quá lâu trước khi các trình duyệt bắt đầu chạy javascript của họ trong một chuỗi riêng biệt từ giao diện người dùng và đồng bộ hóa bất kỳ quyền truy cập nào vào các phần tử giao diện người dùng cho phép giao diện người dùng cập nhật / phản hồi trong quá trình thực thi javascript không truy cập vào giao diện người dùng. Khi / nếu điều đó xảy ra (và tôi hiểu rằng có nhiều rào cản sẽ phải vượt qua, chẳng hạn như trình xử lý sự kiện khởi động trong khi bạn vẫn đang chạy mã khác), chúng ta có thể sẽ thấy hoạt ảnh nhấp nháy trên canvas không sử dụng một số loại đệm kép.
Cá nhân tôi thích ý tưởng về hai yếu tố canvas được đặt chồng lên nhau và xen kẽ được hiển thị / vẽ trên mỗi khung hình. Khá đơn giản và có thể khá dễ dàng được thêm vào một ứng dụng hiện có với một vài dòng mã.