当通过画布运行动画时,我注意到Mavericks中的Safari 7实际上似乎与屏幕随机不同步。我确定它不是随机的,没有计算机真的是什么,所以我希望能够获得一些有关这里真正发生的事情的见解。我认为这是一个刷新同步问题,因为它声称即使它的行为都很冷,也会以很酷的60fps运行。
调用主循环的代码:
Studio.render = function(){
Studio.tick();
Studio.stage.render();
requestAnimationFrame(Studio.render);
}
Studio.tick:
Studio.tick = function() {
this._now = Studio.now();
this.delta = this._now - this.time;
this.time = this._now;
this.frameRatio = this.delta/16.666666666666668; // vs 60fps
};
Studio.now:...我正在使用performance.now shim,所以对于Safari来说它等同于
Date.now
我早就想到它会成为一个内存问题,垃圾收集器正在踢,这导致了随机的口吃。尽可能多地删除,问题仍然存在。
然后我继续交换了requestAnimationFrame window.requestAnimationFrame = window.setTimeout;
的定义,导致Safari使用超时,我在16的持续时间内添加到主Studio.render requestAnimationFrame(Studio.render,16);
事情好像得到了好一点。对此感到困惑,我将其更改为requestAnimationFrame(Studio.render,4);
,突然间它变得柔滑顺滑。显然,这不是内存问题,运行所有计算4x应该导致4倍的暂停。
我希望我错过了一些明显的东西,否则在通过Safari玩游戏时我将不得不诉诸一个感觉错误的setTimeout。
提前致谢。