Джош запитав (деякий час тому) про те, як браузер знає "коли закінчується процес малювання", щоб уникнути мерехтіння. Я хотів би прокоментувати його пост, але мій представник недостатньо високий. Також це лише моя думка. Я не маю фактів, щоб підтвердити це, але я відчуваю це досить впевнено, і це може бути корисно для інших, хто читає це в майбутньому.
Я припускаю, що браузер не "знає", коли ви закінчите малювати. Але так само, як і більшість javascript, поки ваш код працює без відмови від управління браузером, браузер, по суті, заблокований і не / не може оновити / відповісти на свій інтерфейс. Я здогадуюсь, що якщо ви очистите полотно і намалюєте весь кадр, не відмовляючись від керування браузером, він фактично не намалює ваше полотно, поки ви не закінчите.
Якщо ви налаштуєте ситуацію, коли ваш візуалізація охоплює кілька викликів setTimeout / setInterval / requestAnimationFrame, де ви очищаєте полотно в одному дзвінку і малюєте елементи на вашому полотні в наступні кілька дзвінків, повторюючи цикл (наприклад) кожні 5 дзвінків, я Буду готовий поспоритись, що ви побачите мерехтіння, оскільки полотно буде оновлюватися після кожного дзвінка.
Тим не менш, я не впевнений, що довіряв би цьому. Ми вже встигли сказати, що javascript компілюється до власного машинного коду перед виконанням (принаймні це те, що робить движок V8 Chrome з того, що я розумію). Я не був би здивований, якби незабаром браузери почали запускати свій javascript в окремому потоці від інтерфейсу та синхронізувати будь-який доступ до елементів інтерфейсу, дозволяючи інтерфейсу оновлюватись / відповідати під час виконання javascript, який не отримував доступ до інтерфейсу. Коли / якщо це трапиться (і я розумію, що існує багато перешкод, які потрібно було б подолати, наприклад, обробники подій, що запускаються, поки ви все ще використовуєте інший код), ми, мабуть, побачимо мерехтіння на анімації полотна, яка не використовується якесь подвійне буферування.
Особисто мені подобається ідея двох елементів полотна, розташованих один над одним і чергуються, які показано / намальовано на кожному кадрі. Досить ненав’язливий і, мабуть, досить легко додається до існуючого додатка з кількома рядками коду.