4

在此站点上进行一些搜索后,我了解到我无法控制浏览器的mousemove事件频率。

所以我想应用某种外推方法来解决滞后mousemove事件问题。

我记录mousemove事件触发时的每个鼠标位置,并计算加速度(利用有限差分获得速度,然后获得加速度)。

之后在函数中,我测量从上次函数调用render()经过的增量时间。render()最后我用加速度和 推断位置dt

但我没有看到使用这种方法有任何显着效果。有什么不对的吗?

编辑:我在这里做了一个小的运行示例。(对不起,不清楚的问题陈述)

https://gist.github.com/3858124

4

2 回答 2

1

就在我将代码粘贴到要点上之后,我意识到了问题,然后修复了错误。

问题是:

我使用 NDC 坐标来计算导数,而我使用世界空间坐标进行外推。

这是新代码:

https://gist.github.com/3858277

结论:对滞后有一定的影响mouseevent,但影响不大。作为一个(坏的)副作用,当您的鼠标移动进行紧急制动时,将会出现过冲。

我仍在寻求更好的解决方案。欢迎任何意见/建议。谢谢你。

于 2012-10-09T12:01:15.280 回答
0

我不确定你会在外推方面做得更好。所有当前的浏览器都为 javascript 维护一个线程,可以是每个选项卡 (Chrome) 或每个浏览器窗口 (Firefox)。因此,如果您在脚本中工作,则浏览器在脚本运行时根本不会触发 mousemove 事件*。

因此,提高 mousemove 更新频率的最佳方法是优化您的其他 javascript 以避开 mousemove 事件。一种方法是使用更多的异步调用。因此,您可以编写代码来调用setTimeout(nextFunc, 0)循环的下一步,这会将控制权从脚本传回,并允许在循环的下一步之前触发事件。

* The exception to the rule on single threads and synchronous calculation is WebWorkers, which allow you to do a certain set of things in parallel with the rest of the execution, largely those which do not involve the DOM.

于 2012-10-09T12:09:58.947 回答