2013-03-08 37 views
3

我有一个处理某种渲染(webgl)的长时间运行的JavaScript代码。 这是一种“自适应渲染”,其中我随着时间的推移越来越精确地计算表面(意味着场景的“分辨率”变得越来越精确)。如何在运行长javascript代码时处理用户输入事件?

只要用户不按下按键或移动鼠标,我就会让它运行。 正如here所述,我可以使用setTimeout或setInterval,给JavaScript一些时间来处理其他事件。

我测试过的setTimeout和setInterval延误这一jsFiddle,我观察到以下结果:

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

它速度快,但仍然相当困难在我的情况使用。我需要能够做出反应,完成一些计算并呈现在16毫秒给用户的印象运行在60 fps

所以这里的问题(S):

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

2)还有什么我可以用来做一些“长期运行的代码可由用户中断”? (也许网络工作者?)

+0

网络工作者当然可以在这里帮助你,当然他们只能在更新的浏览器上工作... – 2013-03-08 00:52:02

回答

2

你必须把你的代码分成小块,并运行每个块的计时器滴答。在每个计时器滴答声之间,可以处理用户事件,并且如果要让长时间运行的计时器驱动的进程停止执行,可以设置一个标记。

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

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

+0

我也在考虑这些方面的东西......会用'while(true)'循环来完成检查每次迭代的当前时间,查看指定的时间量是否已过? – 2013-03-08 00:56:33

+0

@MattB。 - 如果需要,您可以定期检查长时间运行的代码停止处理中每隔500毫秒的时间,为下一次迭代设置一个计时器,然后返回到事件循环。这将有助于控制每段代码运行的时间长度(不管计算机的速度如何),但显然必须完成执行以允许处理任何未决事件,然后在计时器上继续执行。 – jfriend00 2013-03-08 00:59:08

+0

所以,如果我理解正确,我不得不使用setTimeout或setInterval来管理“计时器滴答”?在那种情况下,我能确定事件会被处理吗? – Sebastien 2013-03-08 02:38:32

相关问题