Просто добавьте в ветку поток, чтобы добавить немного обновления для любого новичка в canvas, который прибывает сюда:
Стэн рекомендовал создать функцию для рисования каждого из шаров в одном месте кода;это хорошо по ряду причин, это делает анимацию более плавной, а код гораздо легче отлаживать / поддерживать.
Я бы не согласился со Стэном, когда дело доходит до использования setInterval для его запуска ..хотя, возможно, это было обычной практикой, когда Стэн написал это.
Теперь, однако, мы используем requestAnimationFrame.
Это синхронизирует вашу картину с остальной частью браузера.
Это позволяет вашему коду работать намного быстрее, так как каждый раз, когда браузер что-то рисует, ему приходится снова просматривать всю страницу, чтобы определить, куда все пойдет, на случай, если что-то переместится.
Использование setInterval не оставляет никаких гарантий относительно того, когда он будет запущен, и, конечно, не время для его совпадения с обновлением экрана браузера.
Это означает, что он немного рисует, реконфигурирует страницу, рисует немного больше,перенастраиваем снова, рисуем еще ... и снова и снова.Это очень плохо и очень медленно.
Использование requestAnimationFrame, однако, позволяет браузеру вызывать вашу функцию, когда он все равно собирается перерисовать экран ... что означает единственную перерисовку и одно обновление.
Гораздо быстрее, намного чище.
Работает немного по-другому, но на самом деле очень просто.
requestAnimationFrame(redraw);
Это регистрирует вашу функцию 'перерисовать' с помощью requestAnimationFrame, так чтов следующий раз, когда браузер захочет перерисовать окно, будет вызвана ваша функция.
Единственное, с чем можно столкнуться, это то, что он будет вызывать вашу функцию только ОДНАЖДЫ ... таким образом, это похоже на setTimeout, а неa setInterval.
Таким образом, вам не нужно передавать переменную таймера, чтобы остановить анимацию;он остановится, потому что он перестал вызываться.
Однако, чтобы гарантировать, что ваша анимация продолжает работать, просто поместите тот же самый вызов внизу функции перерисовки:
function redraw()
{
var blah, blahblah;
...
requestAnimationFrame(redraw);
}
Youможно также установить это условно, чтобы запустить анимацию до ее завершения, а затем остановить:
function redraw()
{
...
if (!finished) requestAnimationFrame(redraw);
}
ссылка Mozilla ЗДЕСЬ , Пол Ирландский ЗДЕСЬ и Крис Койер ЗДЕСЬ .