【问题标题】:use extrapolation to solve mousemove event lag使用外推解决 mousemove 事件延迟
【发布时间】:2012-10-08 13:08:07
【问题描述】:

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

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

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

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

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

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

https://gist.github.com/3858124

【问题讨论】:

  • “但我没有看到使用这种方法有任何显着效果” - 你到底想用外推位置做什么?
  • 你在用它做什么,你如何调用你的渲染方法,你在里面做什么,你如何存储你的测量值,你如何计算它们的时间流逝,你在用什么力量,让你觉得什么都没有发生?

标签: javascript dom mousemove dom-events


【解决方案1】:

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

问题是:

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

这是新代码:

https://gist.github.com/3858277

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

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

【讨论】:

    【解决方案2】:

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

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

    * 单线程和同步计算规则的例外是 WebWorkers,它允许您在执行的其余部分并行执行一组特定的事情,主要是那些不涉及 DOM 的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多