【发布时间】:2015-12-09 10:05:51
【问题描述】:
我已经创建了一个画布,并在其中添加了鼠标事件:
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 ?但是为什么用中间和右键调用呢?
问题应该出在我在 move 方法中调用的代码上,因为当我不按住左键时它可以正常工作,并且在 firefox 上也可以正常工作。一定有其他事情发生。
编辑:我决定在 chrome 上录制,看看发生了什么。结果如下:
真正奇怪的是,当我按下鼠标中键或右键时,游戏会做同样的事情,但一点也不卡顿。你在做什么铬?
编辑:在这里进行测试:www.vertix.io 请注意,似乎并非每个人都能够重现此问题。
感谢您的宝贵时间。
【问题讨论】:
-
您真的每 0.033 秒分配两个新的事件处理程序吗?为什么?另外,
draw()在哪里 -
我会使用画布本身来代替文档...
-
如果你需要帮助,你需要创建一个 MCVE
-
首先将所有代码移出
onmousemove事件并使用window.requestAnimationFrame更新您需要的内容。在鼠标移动事件中,只需抓取并存储鼠标坐标,它不应该是您执行应用程序逻辑的地方。还为 Chrome 添加user-select: none;样式规则添加“-webkit-”到正文或画布元素以停止拖动选择。我不知道这是否会解决您的问题,因为您没有提供复制问题所需的内容 -
可能有html解决方案:尝试添加oncontextmenu="return false;"到画布标签
标签: javascript html google-chrome canvas