我有一个长时间运行的javascript代码,它处理某种呈现(webgl)。这是一种“自适应渲染”,随着时间的推移,我计算一个曲面越来越精确(这意味着场景的“分辨率”变得越来越精确)。
我希望它运行,只要用户不按一个键,或移动鼠标。正如所述的这里,我可以使用setTimeout或setInterval,给javascript一些时间来处理其他事件。
我在这个setTimeout上测试了setInterval和jsFiddle的延迟,并观察到了以下结果:
setTimeout delay: 15-20 ms
setInterval delay: 2-4 ms它很快,但在我的情况下仍然很难使用。我需要能够作出反应,完成一些计算和渲染在16毫秒给用户的印象运行在60 fps。
下面是一个问题:
( 1)是否有其他(更聪明)的方法来检查是否有要处理的传入用户输入事件?
2)还有什么可以用来让“长时间运行的代码被用户打断”的吗?(也许是网络工作者?)
发布于 2013-03-08 00:54:44
您必须将代码分解为小块,并在计时器滴答时运行每个块。在每个计时器滴答之间,可以处理用户事件,如果希望停止执行长时间运行的计时器驱动进程,则可以设置一个标志。
没有其他方法来处理事件或检查挂起的事件。您必须返回到主事件循环,这意味着您的javascript执行线程需要完成。然后,在返回事件循环之后,执行更多代码的唯一方法是响应事件或使用计时器。这正是编写和架构javascript的方式。
您唯一的其他选择是使用web工作者,但他们不能接触DOM,不能在旧浏览器中工作,只能通过消息传递与主事件循环通信。适合做计算,但不适合做动画。
https://stackoverflow.com/questions/15284726
复制相似问题