Javascript 比setTimeout()更有效的方法
Javascript 比setTimeout()更有效的方法,javascript,jquery,performance,Javascript,Jquery,Performance,setTimeout()中给出的时间延迟对Windows和Ubuntu的作用不同 为什么呢 有更好的方法吗?setTimeout()中给出的时间不能保证 这有几个原因: JavaScript的事件队列系统 计时器精度取决于操作系统和/或浏览器(介于1ms和20ms之间) 我在上用JavaScript写了一篇关于时间的博文 关于这个话题 更好的方法是什么? 这取决于你想做什么。还可以查看RequestAnimationFrame(),可能这是为您准备的。RequestAnimationFra
setTimeout()
中给出的时间延迟对Windows和Ubuntu的作用不同
为什么呢
有更好的方法吗?setTimeout()中给出的时间不能保证 这有几个原因:
- JavaScript的事件队列系统
- 计时器精度取决于操作系统和/或浏览器(介于1ms和20ms之间)
这取决于你想做什么。还可以查看RequestAnimationFrame(),可能这是为您准备的。
RequestAnimationFrame
如果在下一个VBLANK之前请求,将为每个监视器VBLANK间隙触发
这样,它是一个非常精确的计时器。然而,它每秒钟会触发60次,如果你在需要再次调用它之前花费的时间超过了16.7毫秒的预算,那么它就不太准确了
如果您的函数在此时间预算内运行,
requestAnimationFrame
将是您可以从Javascript访问的最准确的函数
它的触发方式与设置超时几乎相同:
function myLoop() {
//... < 16.7ms to finish work...
requestAnimationFrame(myLoop);
}
函数myLoop(){
//…完成工作的时间小于16.7毫秒。。。
requestAnimationFrame(myLoop);
}
注意:您需要在某些浏览器中使用前缀或polyfill(请参阅chris的答案中的链接)。不依赖于浏览器操作系统dependent@aaronman已经在两个不同的系统中运行了firefox中的代码,分别是windows和ubuntu操作系统。你说它的工作方式不同是什么意思?你在观察什么?从理论上讲,调用在不同的浏览器或不同的操作系统上的工作方式并没有什么不同。@Aronman为什么认为setTimeout行为依赖于浏览器?setTimeout不是一个精确的计时器@侯赛因指出了一套非常好的答案。请看下面的答案,这是一个公认的答案,其中有一个参考:这可能是您想要使用的东西JavaScript计时器的工作原理,浏览器中的John Resig计时器分辨率,Nicholas C.Zakas,HTML5中的计时器,我会使用
requestAnimationFrame=requestAnimationFrame | | |前缀| | | setTimeout
进行多边形填充。requestAnimationFrame
不会在浏览器窗口/选项卡不可见时触发,是吗?@JanDvorak会,但速率会降低(典型的半秒或1/30s)…我的猜测是OP只是在加载(或完成)某些代码后使用任意延迟使其工作。。。也许我错了,但我不认为计时器的实际精度是他的问题。当然,如果他能澄清一些事情那就太好了。