Я написал небольшой скрипт для рисования (холст) для этого сайта: http://scri.ch/
Когда вы нажимаете на документ, каждое событие mousemove
в основном выполняет следующее:
- Получение координат.
- context.lineTo()
между этой точкой и предыдущей
- context.stroke()
линия
Как видите, если вы перемещаете курсор очень быстро, событие не срабатывает достаточно (в зависимости отна вашем процессоре / браузере / и т. д.), и прямая линия трассируется.
В псевдокоде:
window.addEventListener('mousemove', function(e){
myContext.lineTo(e.pageX, e.pageY);
myContext.stroke();
}, false);
Это известная проблема, и решение хорошо, но я бынравится оптимизировать это.
Поэтому вместо stroke()
каждый раз, когда вызывается событие 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
, которое срабатывает слишком медленно.
Итакпосле того, как я потратил некоторое время на реализацию бесполезной оптимизации, настала ваша очередь: есть ли способ оптимизировать скорость запуска mousemove
в сценариях DOM?
Можно ли «запросить» положение мыши вв любое время?
Спасибо за советы!