了解JavaScript计时器线程问题

res*_*ion 7 javascript timer javascript-events settimeout setinterval

我开始使用一个实际上可以顺利运行的JavaScript MMORPG.目前,我创建了一个演示来证明我可以移动角色并让他们互相聊天,以及看到彼此在现场移动.

http://set.rentfox.net/

现在Javascript计时器是我没有广泛使用的东西,但据我所知,如果我错了就纠正我,是否同时发生多个setIntervals并不能很好地运行b/c它只是在一个线程上.

让我们说我希望有10个不同的人通过使用带有setInterval的精灵背景定位来对怪物进行火球训练 - 该动画需要10个setIntervals来重新绘制用于精灵背景位置移位的DOM.那不是一辆大马车吗?

我想知道是否有办法绕过这一切,也许使用Canvas,这样动画可以同时发生而不创建事件队列,我不必担心计时器.

希望有意义,如果我需要进一步澄清,请告诉我.

T.J*_*der 11

多个setIntervals 的问题是双重的.第一个是你指出的,因为浏览器上的所有Javascript(当前)是单线程的,一个定时器的执行可能会阻止下一个定时器的执行.(工作线程即将到来; Firefox 已经拥有它们,Safari 4 [和其他人]也是如此.)第二个是计时器以设定的间隔发生,但如果你的处理程序在该间隔到期时仍在运行,那么第二个间隔完全被跳过.例如,计时器可能会干扰自身.

最后一部分需要更多的解释:假设你有一个10ms的setInterval(这是你可以合理地期望任何实现的最快速度;可能会被钳制,以便它们不会比这更快).如果你的处理程序需要13毫秒,那么在它开始10ms后应该发生的间隔将被完全跳过.

我通常用setTimeout这种东西.当我的处理程序被触发时,我会完成我的工作,然后在处理程序结束时安排下一个事件.然后(在你可以确定的范围内),我知道下一个事件将在那个时间间隔发生.

对于你正在做的事情,似乎单个"脉冲"计时器是最好的,通过它需要做的任何脉冲.是否使用脉冲计时器setIntervalsetTimeout根据您在实际代码中看到的内容进行判断.