了解JavaScript计时器线程问题

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

http://set.rentfox.net/

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

让我们说我想通过使用带有setInterval的精灵背景定位让10个不同的人在火星上对火球进行核对 – 这个动画需要10个setIntervals来重新绘制用于精灵背景位置移动的DOM.那不是一辆大马车吗?

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

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

解决方法

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

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

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

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...