Ответ 1
requestAnimationFrame
довольно низкий уровень, он просто делает то, что вы уже сказали: грубо получилось вызывается со скоростью 60 кадров в секунду (при условии, что браузер не отстает от этого темпа). Таким образом, вам обычно нужно что-то создавать поверх этого, подобно движку игры, в котором есть игровой цикл.
В моем игровом движке у меня есть это (парафазное/упрощенное здесь):
window.requestAnimationFrame(this._doFrame);
...
_doFrame: function(timestamp) {
var delta = timestamp - (this._lastTimestamp || timestamp);
for(var i = 0, len = this.elements.length; i < len; ++i) {
this.elements[i].update(delta);
}
this._lastTimestamp = timestamp;
// I used underscore.js 'bindAll' to make _doFrame always
// get called against my game engine object
window.requestAnimationFrame(this._doFrame);
}
Тогда каждый элемент моего игрового движка знает, как обновить себя. В вашем случае каждый элемент, который должен обновлять каждые 2, 6, 8 секунд, должен отслеживать, сколько времени прошло и обновить соответственно:
update: function(delta) {
this.elapsed += delta;
// has 8 seconds passed?
if(this.elapsed >= 8000) {
this.elapsed -= 8000; // reset the elapsed counter
this.doMyUpdate(); // whatever it should be
}
}
API холста вместе с requestAnimationFrame
довольно низкий, они являются строительными блоками для таких вещей, как анимация и игровые движки. Если возможно, я попытаюсь использовать существующий, например cocos2d-js, или что-то еще там в эти дни.