【发布时间】:2014-08-27 02:48:51
【问题描述】:
下面的html5例子有什么办法改进,或者是浏览器 只是为了减慢处理鼠标事件? 它是一个网格,在您将鼠标移动到的点上,您会看到一个红色矩形。 但是这个矩形是一种滞后于鼠标的,所以移动到它的位置要慢。 (如果鼠标移动得很快)
代码如下:
<body>
<canvas id="canvas" width="400" height="400">error or not supported.</canvas>
<script>
var lineSize = 10;
var rasterSize = 5;
var bx = 0;
var by = 0;
g2d = document.getElementById("canvas").getContext("2d");
g2d.setFillColor("rgb(10, 10, 10)");
g2d.fillRect(0, 0, g2d.canvas.width, g2d.canvas.height);
g2d.setStrokeColor("rgb(0, 0, 255)");
g2d.setLineWidth(lineSize);
function repaint(){
g2d.clearRect(0, 0, g2d.canvas.width, g2d.canvas.height);
g2d.beginPath();
for(i = 0; i < rasterSize + 1; i++){
g2d.moveTo(0, (lineSize / 2) + i * (g2d.canvas.height - lineSize) / (rasterSize));
g2d.lineTo(g2d.canvas.width, (lineSize / 2) + i * (g2d.canvas.height - lineSize) / (rasterSize));
g2d.moveTo((lineSize / 2) + i * (g2d.canvas.width - lineSize) / (rasterSize), 0);
g2d.lineTo((lineSize / 2) + i * (g2d.canvas.width - lineSize) / (rasterSize), g2d.canvas.height);
}
g2d.stroke();
g2d.setFillColor("red");
g2d.fillRect(bx - 5, by - 5, 11, 11);
}
repaint();
g2d.canvas.addEventListener("mousemove", function(e){
bx = e.offsetX;
by = e.offsetY;
repaint();
});
</script>
</body>
body {
margin: 0;
width: 100%;
height: 100%;
display: block;
background: black;
}
canvas {
margin: auto;
margin-top: 50px;
display: block;
}
【问题讨论】:
-
鼠标的绘制速度总是比浏览器中的任何东西都快,所以无论你做什么都会有延迟
-
处理不当的不是鼠标事件,而是
mousemove是“在很短的时间内调用了很多”类型的事件之一。这意味着repaint每秒被调用一个 lot,因此您需要优化该函数才能看到性能提升。 -
你总是可以把
cursor: none放在画布 css 中来隐藏鼠标,它会减少延迟的感知 -
如果不是检查
mousemove并在它移动时重新绘制,您只需设置一个超时循环并每 100 毫秒或 1 毫秒或任何看起来不错的方式重新绘制鼠标?
标签: javascript html optimization canvas