javascript – 有没有办法加速mousemove事件?

前端之家收集整理的这篇文章主要介绍了javascript – 有没有办法加速mousemove事件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我为这个网站写了一个小图画脚本(画布): http://scri.ch/

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

如您所见,如果您快速移动光标,则事件触发不足(取决于您的cpu /浏览器等),并且跟踪直线.

伪码:

window.addEventListener('mousemove',function(e){
  myContext.lineTo(e.pageX,e.pageY);
  myContext.stroke();
},false);

这是一个已知的问题,解决方案是好的,但我想优化.

因此,每次触发mousemove事件时,我都会将新坐标放在阵列队列中,并定时绘制/清空它.

伪码:

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.(如果有人可以使用实际规格确认,请随意添加它们!)

所以为了得到一个顺利的线,你必须提出一些插值方案.有很多关于这个话题的文学;我推荐monotone cubic interpolation,因为它是本地的,简单的实现,非常稳定(没有超调).

然后,一旦计算了样条曲线,您可以使用足够短的线段逼近它,使其看起来光滑,或者您可以全面输出并编写自己的Bresenham算法来绘制.

如果所有这一切都值得一个简单的绘图应用程序…这当然是你决定的.

猜你在找的JavaScript相关文章