ОК, обо всем по порядку. Что еще происходит во время этой анимации? Любой другой javascript, любые другие таймеры, любые другие обработчики? Ответ, кстати, не может быть ничем . Ваш браузер перерисовывает окно - биты, которые вы меняете, по крайней мере. Если другой javascript работает, помните, что это не совсем так. Javascript является однопоточным по дизайну. Вы можете только очередь для выполнения , поэтому, если какой-то другой javascript перегружает поток, вы не увидите его.
Во-вторых, узнайте, как работают таймеры. http://ejohn.org/blog/how-javascript-timers-work/ - мой личный любимый пост на эту тему. В частности, setTimeout
просит браузер запустить что-либо после по крайней мере указанного времени, но только когда у браузера есть отверстие для этого.
В-третьих, знайте, что вы делаете с function(){animate(i+1);}
. Эта анонимная функция может только существовать в пределах своей родительской функции. Другими словами, когда вы ставите в очередь такую функцию, родительская область все еще существует в стеке вызовов, как указывал @MartinJespersen. И поскольку эта функция ставит в очередь другую, другую и другую ... каждая будет становиться все медленнее.
Я все изложил в маленькой скрипке:
http://jsfiddle.net/KzGRT/
(впервые я использовал jsfiddle, так что будьте добры). Это простая 10-кадровая анимация с (номинально) 100 мс, использующая setTimeout
для каждого. (Я сделал это таким образом вместо setInterval
, потому что, теоретически, тот, который выполняется дольше, должен начать отставать от других. В теории - опять же, потому что javascript является однопоточным, если один замедлится, это также задержит других).
В верхнем методе все десять изображений нарисованы на перекрывающихся холстах, и только по одному показу за раз. Анимация просто скрывает предыдущий кадр и показывает следующий. Второй выполняет putImageData
в холст с функцией верхнего уровня. Третий использует анонимную функцию, как вы пытались. Следите за красной вспышкой на нулевом кадре, и вы увидите, кто выполняет самые быстрые - для меня это занимает некоторое время, но в конечном итоге они начинают дрейфовать (в Chrome, на приличной машине. Это должно быть более очевидно в FF) на что-то более низкое-спекуляция).
Попробуйте на тестовом компьютере низкого уровня и посмотрите, что получится.