Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript document.onmousemove延迟_Javascript - Fatal编程技术网

Javascript document.onmousemove延迟

Javascript document.onmousemove延迟,javascript,Javascript,我正试图在画布上用鼠标和键盘控制构建一个昂贵的脚本。 我正在使用document.onmousemove和document.onkeydown/onkeydup来进行此控制,但当我按下任何按钮时,都会执行大量的“onkeydown”执行,并且鼠标会严重滞后。它看起来像“只写鼠标位置缓冲区”之类的东西。当我松开键时,鼠标“模拟”我先前的动作。 我在Firefox和chrome上进行了测试,这个问题只存在于FF上 这里有一些代码 document.onmousemove = functio

我正试图在画布上用鼠标和键盘控制构建一个昂贵的脚本。 我正在使用document.onmousemove和document.onkeydown/onkeydup来进行此控制,但当我按下任何按钮时,都会执行大量的“onkeydown”执行,并且鼠标会严重滞后。它看起来像“只写鼠标位置缓冲区”之类的东西。当我松开键时,鼠标“模拟”我先前的动作。 我在Firefox和chrome上进行了测试,这个问题只存在于FF上

这里有一些代码

    document.onmousemove  = function(e){
        obj = canvas;
        var curleft = curtop = 0;

        do {
            curleft += obj.offsetLeft;
            curtop += obj.offsetTop;
        } while (obj = obj.offsetParent);

        mX = e.pageX - curleft;
        mY = e.pageY - curtop;
    }

    var dt=0.02;
    setInterval(tick, dt*1000);
    update(dt);
    function tick() {

        if((!pause) || step)
        {
            update(dt);
            step = false;
        }
        interact();
        draw();
    }

根据
更新
交互
绘图
功能的复杂程度,20毫秒的计时器间隔可能太短,占用大量CPU时间。由于JavaScript在单个线程中运行,这可能会阻止脚本处理鼠标事件

这些事件可以在浏览器的输入队列中排队,稍后发送到您的脚本(可能在Firefox中发生),或者如果您的脚本处理速度不够快(可能在Chrome中发生),则这些事件可能会被丢弃

一些可能的解决办法:

  • 增加计时器间隔
  • 不要使用
    setInterval
    ,而是在每次执行
    tick
    后尝试使用
    setTimeout
    ——这将防止多个计时器事件排队并一起触发