【问题标题】:mousemove don't fire every frame when a keyboard event is fired触发键盘事件时,mousemove 不会触发每一帧
【发布时间】:2020-02-08 12:15:40
【问题描述】:

理想情况下,在浏览器中,mousemove 应该在鼠标不断移动时触发每一帧。但是当一个键被按下(或重复)或释放时,mousemove 停止发射一两帧。 我们可以用下面的代码来测试一下:

t0 = new Date().getTime()
window.onmousemove = function() {
    t = new Date().getTime()
    if (t-t0 > 20)
        console.log(t-t0)
    t0 = t
}

尝试保持鼠标移动。只有当您按下、释放一个键或按住一个键(因为它是重复的)时,控制台才会打印 mousemove 的延迟。

我已经在 Firefox 和 Chrome 上进行了测试。我使用 macOS 10.14.2。

我正在编写一个网络动作游戏,所以我需要确保鼠标位置在每一帧都更新。请问有什么解决办法吗?

【问题讨论】:

  • 在 Chrome 中检查后,我发现有很多情况下记录了 t-t0。请记住,JS 有一个循环,许多事情可能会导致某种延迟。在此页面上尝试并将鼠标悬停在您问题中的标签上。这也会导致日志。
  • 没错@JamieDixon,很多电话的发生也需要时间

标签: javascript dom-events mousemove


【解决方案1】:
t0 = new Date().getTime()
window.onmousemove = function() {
    t = new Date().getTime()
    if (t-t0 > 2)
        console.log(t-t0)
    t0 = t
}

这将使 console.log() 快速发疯,当你快速移动鼠标时它不会跳过,还测试了你的代码在按下键时不会跳过,在 Chrome、Windows10 上

您还应该考虑为您的游戏使用主循环来处理和管理时间、帧和事件

【讨论】:

    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2013-08-05
    • 2012-10-26
    • 2019-12-30
    • 2015-08-21
    相关资源
    最近更新 更多