HTML задержка холста, когда левая мышь не работает и движется на Chrome

Я создал холст и добавил к нему события мыши:

canvas = document.getElementById('canvas');
context = canvas.getContext('2d');
canvas.width = screenWidth;
canvas.height = screenHeight;

... 

// CALLED AT START:
function setup() {
    // Mouse movement:
    document.onmousemove = function(e) {
        e.preventDefault();
        target.x = e.pageX;
        target.y = e.pageY;
        angle = Math.atan2((target.y - localPlayer.getY()),
            (target.x - localPlayer.getX()));
        // Distance to mouse Check:
        var dist = Math.sqrt((localPlayer.getX() - target.x)
            * (localPlayer.getX() - target.x) + (localPlayer.getY() - target.y)
            * (localPlayer.getY() - target.y));
        var speedMult = dist / (canvas.height / 4);
        socket.emit("update", {
            ...
        });
    }
    document.onmousedown = function(e) {
        e.preventDefault();
    }
}

Теперь проблема в том, что когда я удерживаю единственную левую кнопку мыши и одновременно двигаю мышь, моя игра сильно отстает. Простое перемещение мыши не вызывает задержки. Я проверил это на Chrome и Firefox. Кажется, что я могу воссоздать проблему только на Chrome. Использование средней кнопки мыши или правой кнопки приводит к тому же поведению в игре и не вызывает задержки. Только при использовании левой кнопки мыши вызывает отставание.

Я искал ответы и обнаружил, что должен предотвратить поведение по умолчанию, например:

e.preventDefault();

Но это не решило проблему. Я также попытался обновить число на экране, которое представляет положение мыши. И он обновился нормально. Только игра сама отстала. Может ли быть так, что onMouseMoved никогда не вызывается, пока левая кнопка удерживается нажатой? Но тогда почему он вызывается со средней и правой кнопкой?

Проблема должна заключаться в коде I, вызываемом внутри метода move, потому что он отлично работает, когда я не удерживаю левую клавишу, и хорошо работает в Firefox. Там должно быть что-то еще происходит.

РЕДАКТИРОВАТЬ: Я решил запись на Chrome, чтобы посмотреть, что происходит. Вот результат: Я нажимаю левую кнопку

Что действительно странно, когда я нажимаю среднюю кнопку мыши или правую кнопку, игра делает то же самое, но не отстает вообще. Что ты делаешь хром?

РЕДАКТИРОВАТЬ: Проверьте это здесь: www.vertix.io обратите внимание, что не все, кажется, в состоянии воспроизвести эту проблему.

Спасибо за ваше время.

4 ответа

Когда вы удерживаете левую кнопку мыши и одновременно перемещаете ее, вы перетаскиваете.

Изменить: в некоторых версиях Chrome есть ошибка (когда я отправил этот ответ, у меня был, а теперь нет), что привело к drag события, которые должны быть запущены даже без элемента, имеющего draggable приписывать. Обычно, drag события должны быть только из элементов, которые имеют draggable атрибут установлен в true (кроме изображений и якорей, которые по умолчанию доступны для перетаскивания).

Согласно MDN, когда drag события запускаются, mouse события, такие как mousemove, нет, что означает, что ваша функция не вызывается.

Возможное решение - использовать одну и ту же функцию для обоих drag а также mousemove События:

function mouseMove(e) {
    //do your things here
    ...
}

document.addEventListener('mousemove', mouseMove);

document.addEventListener('drag', mouseMove);

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

У вас есть событие мыши на документе. Поскольку мы не видим, что у вас есть в документе, трудно понять, является ли это причиной ваших проблем.

Попробуйте перенести событие мыши только на холст, так как это единственное место, где оно вам нужно, я полагаю. Нет смысла обрабатывать события для документа, если он не является частью игры, плюс документ является последним в списке, если к дочерним элементам прикреплены события. Сначала они идут, а потом он становится твоим.

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

И использовать addEventListener вместо непосредственного прикрепления события через .onmousedown = eventHandler
например canvas.addEventListener("mousedown",eventHandler);

И добавьте прослушиватель событий к нужному элементу, а не к документу.

function mouseMove(e) {
//do your things here
...
 }

 document.onmousemove = mouseMove;

  document.ondrag = function(e) {
mouseMove(e);
//do another things
...
}

Вы думали о троттлинге?

Проверьте https://blog.toggl.com/2013/02/increasing-perceived-performance-with-_throttle/

Другие вопросы по тегам