了解JavaScript计时器线程问题

时间:2010-05-06 07:08:09

标签: javascript javascript-events timer settimeout setinterval

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

http://set.rentfox.net/

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

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

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

希望这是有道理的,如果我需要进一步澄清,请告诉我。

2 个答案:

答案 0 :(得分:11)

多个setInterval的问题是双重的。第一个是你指出的,因为浏览器上的所有Javascript(当前)是单线程的,一个定时器的执行可能会阻止下一个定时器的执行。 (Worker threads即将到来; Firefox already has them,Safari 4 [和其他人]也是如此。)第二个是计时器以设定的间隔发生,但是如果您的处理程序仍然在运行时间隔到期,完全跳过第二个间隔。例如,计时器可能会干扰自己。

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

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

对于你正在做的事情,看起来单个“脉冲”计时器似乎是最好的,通过它需要对脉冲做什么。该脉冲计时器是使用setInterval还是setTimeout是基于您在实际代码中看到的内容的判断调用。

答案 1 :(得分:3)

+1 T. T. Crowder,答案很完美。我强烈建议学习使用Canvas over DOM节点进行游戏动画;后者是缓慢和错误的,并将在任何非平凡的情况下挂起浏览器。 OTOH,Canvas速度更快,可以硬件加速,如果需要,甚至可以有3D上下文。