3

我有一个长时间运行的 javascript 代码来处理某种渲染(webgl)。这是某种“自适应渲染”,我会随着时间的推移越来越精确地计算表面(这意味着场景的“分辨率”变得越来越精确)。

只要用户不按键或移动鼠标,我希望它运行。如此处所述,我可以使用 setTimeout 或 setInterval,给 javascript 一些时间来处理其他事件。

我已经在这个jsFiddle上测试了 setTimeout 和 setInterval 延迟,我观察到以下结果:

setTimeout delay: 15-20 ms
setInterval delay: 2-4 ms

它很快,但在我的情况下仍然很难使用。我需要能够做出反应,完成一些计算并在16 毫秒内渲染,以给用户以60 fps运行的印象。

所以这里的问题(S):

1)是否有其他(更聪明的)方法来检查是否有一些传入的用户输入事件需要处理?

2)还有什么我可以用来制作“用户可中断的长时间运行代码”的东西吗?(也许是网络工作者?)

4

1 回答 1

2

您必须将代码分成小块并在计时器滴答声上运行每个块。在每个计时器滴答之间,可以处理用户事件,如果您希望停止长时间运行的计时器驱动进程的执行,您可以设置一个标志。

没有其他方法可以处理事件或检查未决事件。您必须返回到主事件循环,这意味着您的 javascript 执行线程需要完成。而且,在返回到事件循环后,您可以执行更多代码的唯一方法是响应事件或使用计时器。这就是 javascript 的编写和架构方式。

您唯一的其他选择是使用网络工作者,但它们不能接触 DOM,不能在旧版浏览器中工作,并且只能通过消息传递与主事件循环进行通信。适合做计算,但不适合做动画。

于 2013-03-08T00:54:44.550 回答