我有一个画布正在绘制图像和剪裁以创建图像被显示的效果。我有正常的代码我尝试使用debouce方法和rAF来增加画布渲染性能,但我只看到小的收益,如果有的话。
我怀疑我在迭代x和y坐标数组的方式可能是个问题。 当它将数组放在控制台中的速度与屏幕上显示的圆圈相同时,它似乎相当滞后。
这是重绘功能:
function redraw(mouse) {
m.push(mouse);
m.forEach(function (a) {
ctx.drawImage(img, 0, 0);
ctx.beginPath();
ctx.rect(0, 0, 500, 500);
ctx.arc(a.x, a.y, 70, 0, Math.PI * 2, true);
ctx.clip();
ctx.fillRect(0, 0, 500, 500)
})
}
我想我正在寻找的是加速我的代码的一些建议,所以圆圈的渲染看起来更像绘图。
这是工作演示 - > http://jsfiddle.net/naeluh/4h7GR/
答案 0 :(得分:3)
这里有几个问题:
•您的鼠标代码是一场噩梦,每次移动都会遍历DOM
•您正在重新绘制每个动作的所有内容。
所以我建议一种更有效的解决方案:
•堆叠两个画布,下面的一个是你的图像,顶部的一个是面具
•有效处理鼠标
•仅在鼠标移动时清除部分遮罩画布:每次移动时,在遮罩画布上仅绘制一个圆
(因为我使用了globalCompositeOperation =' destination-out')
Firefox,Chrome或Safari上的结果非常流畅。
(在mac OS上测试)。
小提琴: (你必须点击清除)
http://jsfiddle.net/gamealchemist/4h7GR/22/
html
<canvas style='position: absolute; top: 0;left: 0;' id="canvas1" width="500" height="500"></canvas>
<canvas style='position: absolute;top: 0;left: 0;' id="canvas2" width="500" height="500"></canvas>
js
var can = document.getElementById("canvas1");
var ctx = can.getContext("2d");
var can2 = document.getElementById("canvas2");
var ctx2 = can2.getContext("2d");
var img = new Image();
img.onload = function () { ctx.drawImage(img,0,0); };
img.src = "http://placekitten.com/500/500";
ctx2.fillStyle='#000';
ctx2.fillRect(0,0,500,500);
ctx2.globalCompositeOperation = 'destination-out';
function clearThis(x,y) {
console.log('toto');
ctx2.fillStyle='#F00000';
ctx2.beginPath();
ctx2.arc(x, y, 70, 0, Math.PI * 2, true);
ctx2.fill();
}
var mouse = {
x: 0,
y: 0,
down: false
};
function setupMouse(canvas, onMouseMove, preventDefault) {
var rectLeft, rectTop;
var hook = canvas.addEventListener.bind(canvas);
var mouseDown = updateMouseStatus.bind(null, true);
var mouseUp = updateMouseStatus.bind(null, false);
hook('mousedown', mouseDown);
hook('mouseup', mouseUp);
hook('mousemove', updateCoordinates);
hook('scroll', updateRect);
// var mouseOut = function() { mouse.down=false ; } ;
// hook('mouseout', mouseOut);
function updateMouseStatus(b, e) {
mouse.down = b;
updateCoordinates(e);
if (preventDefault) {
e.stopPropagation();
e.preventDefault();
}
}
function updateCoordinates(e) {
mouse.x = (e.clientX - rectLeft);
mouse.y = (e.clientY - rectTop);
onMouseMove(mouse.x, mouse.y);
}
function updateRect() {
var rect = canvas.getBoundingClientRect();
rectLeft = rect.left;
rectTop = rect.top;
}
updateRect();
};
setupMouse(can2, clearThis, true);
答案 1 :(得分:1)
上面的代码会很好..但是需要一些编辑 我已经在小提琴中编辑了代码..而且我相信有一些改进的性能
为什么每次都需要添加clip和fillRect ..最后一次......主要问题解决了,就像
can.addEventListener("mousemove", function (e) {
var mouse = getMouse(e, can);
requestAnimationFrame(function () {
redraw(mouse);
ctx.clip();
ctx.fillRect(0, 0, 500, 500);
console.log(mouse);
});
}, false);