我正在尝试复制在 stackoverflow 上描述的方法。但是我遇到了一些我不知道如何解决的问题。
我设置了jsfiddle来演示一切。这是第二个jsfiddle,只有粒子移动和被绘制。
我的问题在于绘图,分析器显示大约 10000 个粒子 drawImage 占用了总循环时间的 40%。没有直接绘图,只有计算,没有什么会妨碍代码执行,所以问题在于绘图。
有没有办法在没有这些副作用的情况下使用这种技术?目前,我向您展示了如何使用圆弧创建圆形区域,但我也将 png 文件用于其他一些对象,它们表现出完全相同的行为。
(问题:黑色重叠区域而不是透明区域,通过上面的圆圈可以看到底部圆圈的边缘)
我希望我尽可能清楚地表达自己(上图非常清楚地显示了我的问题),我要感谢您的帮助。
绘制功能 - 最终绘制到可见画布。
Game.prototype.draw2 = function(interpolation, canvas, ctx, group)
{
var canvasData = ctx.createImageData(canvas.width, canvas.height),
cData = canvasData.data;
for (var i = 0; i < group.length; i++)
{
var obj = group[i];
if(!obj.draw)
{
continue;
}
var imagePixelData = obj.imagePixelData;
var x = obj.previous.x + (obj.x - obj.previous.x) * interpolation;
var y = obj.previous.y + (obj.y - obj.previous.y) * interpolation;
for (var w = 0; w < obj.width; w++)
{
for (var h = 0; h < obj.height; h++)
{
if (x + w < canvas.width && obj.x + w > 0 &&
y + h > 0 && y + h < canvas.height)
{
var iData = (h * obj.width + w) * 4;
var pData = (~~ (x + w) + ~~ (y + h) * canvas.width) * 4;
cData[pData] = imagePixelData[iData];
cData[pData + 1] = imagePixelData[iData + 1];
cData[pData + 2] = imagePixelData[iData + 2];
if (cData[pData + 3] < 100)
{
cData[pData + 3] = imagePixelData[iData + 3];
}
}
}
}
}
ctx.putImageData(canvasData, 0, 0);
};
这就是我如何在其他隐形画布上准备粉红色圆形区域。
Game.prototype.constructors.Attractor.prototype.getImageData = function(context)
{
this.separateScene = new context.constructors.Graphics(this.width, this.height, false);
this.image = this.separateScene.canvas;
this.separateScene.ctx.beginPath();
this.separateScene.ctx.arc(this.radius, this.radius, this.radius, 0, 2 * Math.PI, false);
this.separateScene.ctx.fillStyle = '#ff9b9b';
this.separateScene.ctx.fill();
this.separateScene.ctx.beginPath();
this.separateScene.ctx.arc(this.radius, this.radius, this.radiusCut, 0, 2 * Math.PI, false);
this.separateScene.ctx.fillStyle = 'rgba(255, 255, 255, 0.27)';
this.separateScene.ctx.fill();
this.separateScene.ctx.beginPath();
this.separateScene.ctx.arc(this.radius, this.radius, this.coreRadius, 0, 2 * Math.PI, false);
this.separateScene.ctx.fillStyle = '#ff64b2';
this.separateScene.ctx.fill();
this.imageData = this.separateScene.ctx.getImageData(0, 0, this.width, this.height);
this.imagePixelData = this.imageData.data;
};