我们面临与 mousemove 相关的 jQuery 事件传播性能问题:
我们有一个屏幕填充画布,需要跟踪用户是否在其上拖动鼠标,因此我们在该对象上添加了一个鼠标移动侦听器,如下所示:
ourCanvas.on('mousemove',
function(event) {
event.preventDefault();
//our drag code here
}
});
这段代码运行良好,但我们在一个测试系统上的当前 Firefox (24) 中遇到了严重的性能问题。分析器告诉我们,大部分时间都花在了jQuery.event.dispatch()
(我们尝试了当前最新的 jQuery 1.8、1.9、1.10 和 2.0)。
我们通过在此处使用“jQuery.event.fix()”性能优化成功地减少了 dispatch() 函数所花费的时间:http: //bitovi.com/blog/2012/04/faster-jquery-event-fix。 html但该测试系统的性能仍远低于我们的预期。
经过一些进一步的测试,我设法将其固定在系统上使用的鼠标上:它使用了1000Hz。我们将使用过的鼠标调低到 125Hz,瞧,性能很棒。
我们的假设是,鼠标的高 Hz 速率会导致大量 mousemove 事件,因此我们更改了上面的代码以应用事件限制,并且仅每 X 毫秒调用一次事件处理:
var lastMove = 0;
var eventThrottle = 1;
ourCanvas.on('mousemove',
function(event) {
event.preventDefault();
var now = Date.now();
if (now > lastMove + eventThrottle) {
lastMove = now;
//our drag code here
}
}
});
它就像一个魅力,表现很棒。即使我们只跳过两毫秒的事件。
现在我有两个问题:
我们在其他位置将 mousemove 侦听器附加到不同的 HTML 元素,我想将这个手工制作的节流阀添加到所有这些
mousemove
处理程序中,以免再次遇到问题。这在 jQuery (2.0.3) 中是否有可能以一种很好的方式实现?我preDispatch
在 jQuery javascript 中看到了钩子,但它们已经在调用 fix() 之后,这也需要一些时间,我也想保存该调用。我对 2ms 已经足以获得非常好的性能这一事实感到困惑,
eventThrottle
所以我添加了一个计数器来查看有多少事件被跳过。令人惊讶的结果:它只跳过了 0-1 个事件……在 100 毫秒的节流阀下,跳过的事件大约为 60-70,所以如果每毫秒的 mousemove 事件少于 1 个,为什么这段代码会有这样的事件?毕竟是积极的影响吗?
感谢您的任何评论,克里斯托弗