Josh preguntó (hace un tiempo) cómo sabe el navegador "cuándo termina el proceso de dibujo" para evitar el parpadeo. Habría comentado directamente en su publicación, pero mi reputación no es lo suficientemente alta. Además, esta es solo mi opinión. No tengo datos que lo respalden, pero me siento bastante seguro y puede ser útil para otras personas que lean esto en el futuro.
Supongo que el navegador no "sabe" cuando terminas de dibujar. Pero al igual que la mayoría de los javascript, siempre que su código se ejecute sin ceder el control al navegador, el navegador está esencialmente bloqueado y no podrá / no podrá actualizar / responder a su interfaz de usuario. Supongo que si borra el lienzo y dibuja todo el marco sin ceder el control al navegador, en realidad no dibujará su lienzo hasta que haya terminado.
Si configura una situación en la que su representación abarca múltiples llamadas setTimeout / setInterval / requestAnimationFrame, donde borra el lienzo en una llamada y dibuja elementos en su lienzo en las siguientes llamadas, repitiendo el ciclo (por ejemplo) cada 5 llamadas, yo Estaría dispuesto a apostar a que verá un parpadeo, ya que el lienzo se actualizará después de cada llamada.
Dicho esto, no estoy seguro de que pueda confiar en eso. Ya estamos en el punto en que javascript se compila en código de máquina nativo antes de la ejecución (al menos eso es lo que hace el motor V8 de Chrome, según tengo entendido). No me sorprendería si no pasara mucho tiempo antes de que los navegadores comenzaran a ejecutar su javascript en un hilo separado de la interfaz de usuario y sincronizaran cualquier acceso a los elementos de la interfaz de usuario, lo que permite que la interfaz de usuario se actualice / responda durante la ejecución de javascript que no estaba accediendo a la interfaz de usuario. Cuando o si eso sucede (y entiendo que hay muchos obstáculos que tendrían que superarse, como que los controladores de eventos se inicien mientras todavía está ejecutando otro código), probablemente veremos parpadeo en la animación del lienzo que no está usando una especie de doble búfer.
Personalmente, me encanta la idea de dos elementos de lienzo colocados uno encima del otro y alternando que se muestran / dibujan en cada marco. Bastante poco intrusivo y probablemente se puede agregar fácilmente a una aplicación existente con unas pocas líneas de código.