我們正面臨着連接到鼠標移動jQuery的事件傳播的性能問題:jQuery mousemove性能 - 油門事件?
我們有一個屏幕填充畫布和需要,如果用戶拖動它的鼠標追蹤,所以我們增加了鼠標移動偵聽器對象像這樣:
ourCanvas.on('mousemove',
function(event) {
event.preventDefault();
//our drag code here
}
});
此代碼工作正常,但我們一個測試系統上已經在當前的Firefox(24)嚴重的性能問題。 Profiler告訴我們,大部分時間都花在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,瞧,表現非常好。
我們的假設是,該鼠標上的高赫茲率引起了很多鼠標移動事件,所以我們改變了上面的代碼,以將事件油門,只能調用事件處理每隔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
}
}
});
它像一個迷人的工作,表現很棒。即使我們只跳過兩毫秒的事件。
現在我有兩個問題:
我們有我們重視鼠標移動聽衆不同的HTML元素和我想這個手工製作油門添加到所有這些
mousemove
處理的其他位置不要再次遇到問題。這在某種程度上可以在jQuery(2.0.3)中以一種很好的方式做到嗎?我已經在jQuery javascript中看到了preDispatch
鉤子,但是它們已經在調用fix()之後調用,這也使用了一些時間,我也想保存該調用。我對2ms的
eventThrottle
已經足以獲得非常好的性能感到困惑,所以我添加了一個計數器來查看有多少事件被跳過。令人驚訝的結果是:它只跳過0-1個事件...在100ms的節流時,跳過的事件大約爲60-70,所以如果每毫秒少於1個mousemove事件,則爲,爲什麼此代碼有畢竟這種積極的影響?
感謝您的任何意見, 克里斯托弗
謝謝:@ 1:使用'setTimeout()'和'clearTimeout()'的有趣插件,但它並不限制實際的事件處理。兩個副作用:1:我仍然需要調用'$ .throttle()'而不是'$ .on()'(很難用多個開發人員實現)。 2:CPU繁重的jQuery處理開銷仍然存在(調用'fix()',...)。也許最簡潔的解決方案是將自己的jQuery事件處理函數改寫爲「插件」。@ 2我們的處理程序更改了從'requestAnimationFrame'上運行的循環訪問的一些變量。 @Firebug:你說的對FF24來說,只是用停用的Firebug進行測量。 –
如果你想得到什麼吃你的CPU的幫助,你將不得不張貼一些代碼... – LeGEC