Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.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 有没有办法加速mousemove事件?_Javascript_Dom_Mousemove - Fatal编程技术网

Javascript 有没有办法加速mousemove事件?

Javascript 有没有办法加速mousemove事件?,javascript,dom,mousemove,Javascript,Dom,Mousemove,我为这个网站写了一个小的绘图脚本(画布): 单击文档时,每个mousemove事件基本上执行以下操作: -获取坐标。 -context.lineTo()在这一点和上一点之间 -context.stroke() 如您所见,如果您将光标移动得非常快,则事件触发不够(取决于您的CPU/浏览器等),并且会跟踪一条直线 在伪代码中: window.addEventListener('mousemove', function(e){ myContext.lineTo(e.pageX, e.pageY);

我为这个网站写了一个小的绘图脚本(画布):

单击文档时,每个
mousemove
事件基本上执行以下操作:
-获取坐标。
-
context.lineTo()
在这一点和上一点之间
-
context.stroke()

如您所见,如果您将光标移动得非常快,则事件触发不够(取决于您的CPU/浏览器等),并且会跟踪一条直线

在伪代码中:

window.addEventListener('mousemove', function(e){
  myContext.lineTo(e.pageX, e.pageY);
  myContext.stroke();
}, false);
var coordsQueue = [];

window.addEventListener('mousemove', function(e){
  coordsQueue.push([e.pageX, e.pageY]);
}, false);

function drawLoop(){
  window.setTimeout(function(){
    var coords;
    while (coords = coordsQueue.shift()) {
      myContext.lineTo(coords[0], coords[1]);
    }
    myContext.stroke();
    drawLoop();
  }, 1000); // For testing purposes
}
这是一个已知的问题,解决方案很好,但我想优化它

因此,每次触发mousemove事件时,我都将新坐标放入数组队列中,并使用计时器定期绘制/清空它,而不是
stroke()

在伪代码中:

window.addEventListener('mousemove', function(e){
  myContext.lineTo(e.pageX, e.pageY);
  myContext.stroke();
}, false);
var coordsQueue = [];

window.addEventListener('mousemove', function(e){
  coordsQueue.push([e.pageX, e.pageY]);
}, false);

function drawLoop(){
  window.setTimeout(function(){
    var coords;
    while (coords = coordsQueue.shift()) {
      myContext.lineTo(coords[0], coords[1]);
    }
    myContext.stroke();
    drawLoop();
  }, 1000); // For testing purposes
}
但这并没有改善生产线。所以我试着只在
mousemove
上画一个点。相同的结果:点之间的空间过大

这让我意识到第一个代码块足够有效,只是触发的
mousemove
事件太慢了

所以,在我花了一些时间实现了一个无用的优化之后,轮到你了:有没有办法优化DOM脚本中的
mousemove
触发速度

是否可以随时“请求”鼠标位置


谢谢你的建议

如果你想增加报道频率,恐怕你运气不好。鼠标每秒只向操作系统报告n次它们的位置,我认为n通常小于100。(如果有人能用实际规格确认这一点,请随意添加!)

所以为了得到一条平滑的直线,你必须想出一些插值方案。有很多关于这个话题的文献;我推荐它,因为它是本地的,易于实现,并且非常稳定(没有超调)

然后,在计算样条曲线后,可以使用足够短的线段来近似它,使其看起来平滑,或者可以全力以赴编写自己的算法来绘制它


如果所有这些都值得一个简单的绘图应用程序。。。当然,这是由您自己决定的。

很酷的站点,不幸的是,无法使用JavaScript请求鼠标的当前位置,您仅有的挂钩是您正在使用的事件。如果你必须有更多的控制,我会看看使用闪光灯,你可以改变帧速率和请求鼠标位置

trace("Mouse X: " + _xmouse);
trace("Mouse Y: " + _ymouse);

重复:谢谢你的链接,但是是的,这对这个应用程序来说有点过分了。我认为问题不是来自操作系统(Photoshop快得多),而是来自浏览器,他们自愿限制mousemove事件的触发,当然是因为许多脚本直接依赖它来完成密集的任务。但是为什么不允许作者请求鼠标位置呢?类似于
window.getMousePosition()
?SVG Edit()是开源的,显然可以进行一些平滑计算,因此您可能不需要重新创建控制盘。普通鼠标每秒发送大约100-150次更新。我的罗技G3发送500。游戏鼠标可能会发送更多信息。谢谢,但我不会使用Flash,我是一个开放标准的传道者!;-)那么你就要受这些标准的摆布:-)比受闪光灯摆布要好得多。