我开始使用实际上能够顺利运行的JavaScript MMORPG。目前,我创建了一个演示程序来证明我可以移动角色并让他们互相聊天,以及看到彼此在现场移动。
现在Javascript计时器是我没有广泛使用的东西,但据我所知,如果我错了就纠正我,是否同时发生多个setIntervals并不能很好地运行b / c它全部都在一个线程。
假设我想让10个不同的人通过使用带有setInterval的精灵背景定位来对怪物进行火球训练 - 该动画需要10个setIntervals来重新绘制DOM以进行精灵背景位置移动。那不是一辆大马车吗?
我想知道是否有办法绕过这一切,也许是使用Canvas,这样动画可以同时发生而无需创建事件队列,我不必担心计时器。
希望这是有道理的,如果我需要进一步澄清,请告诉我。
答案 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上下文。