Josh fragte (vor einiger Zeit), wie der Browser weiß, "wann der Zeichenvorgang endet", um ein Flackern zu vermeiden. Ich hätte seinen Beitrag direkt kommentiert, aber mein Repräsentant ist nicht hoch genug. Auch das ist nur meine Meinung. Ich habe keine Fakten, um dies zu belegen, aber ich bin ziemlich zuversichtlich, und es kann für andere hilfreich sein, dies in Zukunft zu lesen.
Ich vermute, der Browser "weiß" nicht, wann Sie mit dem Zeichnen fertig sind. Aber genau wie bei den meisten Javascript ist der Browser im Wesentlichen gesperrt und kann / kann nicht auf seine Benutzeroberfläche aktualisieren / reagieren, solange Ihr Code ausgeführt wird, ohne die Kontrolle an den Browser abzugeben. Ich vermute, wenn Sie die Leinwand löschen und Ihren gesamten Rahmen zeichnen, ohne die Kontrolle an den Browser abzugeben, wird Ihre Leinwand erst dann gezeichnet, wenn Sie fertig sind.
Wenn Sie eine Situation einrichten, in der Ihr Rendering mehrere setTimeout / setInterval / requestAnimationFrame-Aufrufe umfasst, in der Sie die Zeichenfläche in einem Aufruf löschen und in den nächsten mehreren Aufrufen Elemente auf Ihrer Zeichenfläche zeichnen und den Zyklus (z. B.) alle 5 Aufrufe wiederholen, I. Ich würde wetten, dass Sie ein Flackern sehen würden, da die Leinwand nach jedem Anruf aktualisiert wird.
Trotzdem bin ich mir nicht sicher, ob ich dem vertrauen würde. Wir sind bereits an dem Punkt angelangt, an dem Javascript vor der Ausführung zu nativem Maschinencode kompiliert wird (zumindest macht das die V8-Engine von Chrome, soweit ich weiß). Es würde mich nicht wundern, wenn es nicht zu lange dauern würde, bis Browser ihr Javascript in einem von der Benutzeroberfläche getrennten Thread ausführen und den Zugriff auf Benutzeroberflächenelemente synchronisieren, sodass die Benutzeroberfläche während der Ausführung von Javascript, die nicht auf die Benutzeroberfläche zugreift, aktualisiert / reagiert werden kann. Wenn / falls dies passiert (und ich verstehe, dass es viele Hürden gibt, die überwunden werden müssten, z. B. Event-Handler, die starten, während Sie noch anderen Code ausführen), werden wir wahrscheinlich Flimmern auf Leinwand-Animationen sehen, die nicht verwendet werden eine Art Doppelpufferung.
Persönlich mag ich die Idee, dass zwei Leinwandelemente übereinander positioniert und abwechselnd auf jedem Rahmen gezeigt / gezeichnet werden. Ziemlich unauffällig und wahrscheinlich ziemlich einfach zu einer vorhandenen Anwendung mit ein paar Codezeilen hinzuzufügen.