Подтвердить что ты не робот

Есть ли способ ускорить событие mousemove?

Я написал небольшой рисунок script (canvas) для этого сайта: 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?

Возможно ли "запросить" позицию мыши в любое время?

Спасибо за ваши советы!

4b9b3361

Ответ 1

Если вы хотите увеличить частоту отчетности, я боюсь, что вам не повезло. Мыши только сообщают о своей позиции в операционной системе n раз в секунду, и я думаю, что n обычно меньше 100. (Если кто-то может подтвердить это с помощью реальных спецификаций, не стесняйтесь их добавлять!)

Итак, чтобы получить гладкую линию, вам придется придумать какую-то схему интерполяции. Там много литературы по этой теме; Я рекомендую монотонную кубическую интерполяцию, потому что она локальная, простая в реализации и очень стабильная (без перерегулирования).

Затем, как только вы вычислили сплайн, вы можете аппроксимировать его линейными сегментами достаточно короткими, чтобы он выглядел гладко, или вы можете разобраться и написать свой собственный Bresenham, чтобы нарисовать его.

Если все это стоит для простого приложения рисования... это, конечно, для вас.

Ответ 2

Прохладный сайт, к сожалению, нет способа запросить текущую позицию мыши с помощью JavaScript, единственные перехватчики, которые у вас есть, - это те события, которые вы уже используете. Если вы должны иметь больше контроля, я бы посмотрел на флэш, где вы можете изменить частоту кадров и запросить позицию мыши.

trace("Mouse X: " + _xmouse);
trace("Mouse Y: " + _ymouse);