7

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

http://set.rentfox.net/

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

假设我想让 10 个不同的人通过使用带有 setInterval 的精灵背景定位来向怪物发射火球——该动画将需要 10 个 setInterval 来重新绘制 DOM 以改变精灵背景位置。不会是大车吗?

我想知道是否有办法解决所有这些问题,也许使用 Canvas,这样动画就可以同时发生而无需创建事件队列,而且我不必担心计时器。

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

4

2 回答 2

11

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

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

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

对于您正在做的事情,似乎最好使用单个“脉冲”计时器,以完成它需要对脉冲执行的任何操作。该脉冲计时器是使用setInterval还是setTimeout根据您在实际代码中看到的判断调用。

于 2010-05-06T07:18:43.507 回答
3

+1 给 TJ Crowder,答案是完美的。我强烈建议学习使用 Canvas over DOM 节点来制作游戏动画;后者速度慢且有问题,并且会在任何重要的情况下挂起浏览器。OTOH,Canvas 速度更快,可以进行硬件加速,如果需要,甚至可以提供 3D 上下文。

于 2010-05-06T07:49:13.577 回答