Мы столкнулись с проблемой, с JQuery производительность распространения событий, связанных с MouseMove:jQuery mousemove performance - дроссельные события?
У нас есть заполнение экрана холста и необходимо отслеживать, если пользователь перетаскивает мышью на ней, поэтому мы добавили мышь двигаться слушателя на этот объект как это:
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).
Мы успешно сократили время, затрачиваемое на функцию dispatch(), используя оптимизацию производительности jQuery.event.fix(): http://bitovi.com/blog/2012/04/faster-jquery-event-fix.html, но производительность в этой тестовой системе все еще была ниже ожидаемой.
После некоторого дальнейшего тестирования, мне удалось прикрепить это вниз на мыши, используемой в системе: Она используется 1000Hz. Мы переключили используемую мышь на 125 Гц и вуаля, производительность была отличная.
Наше предположение было, что высокая частота Гц на мыши вызвало много 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(), который также использует некоторое время, и я также хотел бы сохранить этот вызов.Я был озадачен тем фактом, что уже достаточно было
eventThrottle
2ms, чтобы получить действительно хорошую производительность, поэтому я добавил счетчик, чтобы узнать, сколько событий пропущено. Удивительный результат: он пропускает только события 0-1 ... С дроссельной заслонкой 100 мс пропущенные события были в порядке 60-70, поэтому , если есть менее 1 события mousemove за мс, почему этот код имеет такой положительный эффект в конце концов?
Спасибо за любые комментарии, Кристофер
Спасибо: @ 1: Интересный плагин с использованием 'setTimeout()' и 'clearTimeout()', но он не ограничивает обработку фактических событий. Два побочных эффекта: 1: мне все равно нужно называть '$ .throttle()' вместо '$ .on()' (трудно достичь с несколькими разработчиками). 2: Накладные расходы процессора jQuery по-прежнему остаются (вызовы 'fix()', ...). Возможно, самым чистым решением было бы перезаписать функцию обработки jQuery как «плагин»[email protected] 2 Наш обработчик изменяет некоторые переменные, получаемые из цикла, запущенного на 'requestAnimationFrame'. @Firebug: Вы правы в FF24, только измеряется с отключенным Firebug. –
Если вы хотите получить помощь по тому, что съедает ваш процессор, вам придется опубликовать код ... – LeGEC