【发布时间】:2019-07-23 01:51:03
【问题描述】:
我正在做一个项目,我希望让黑暗覆盖屏幕,让角色在黑暗中发光。我尝试为场景设置动画,然后使用以下代码在其上绘制黑暗:
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var canvasWidth = canvas.width;
var canvasHeight = canvas.height;
var pixelSize = 30;
var width = canvasWidth/pixelSize;
var height = canvasHeight/pixelSize;
var lightX = canvasWidth/2;
var lightY = canvasHeight/2;
var lightDiameter = 100;
var a = lightDiameter*pixelSize;
for(var x = 0; x < width; x++) {
for(var y = 0; y < height; y++) {
var alpha = 1.25 - a/(Math.pow(x*30 - lightX, 2) + Math.pow(y*30 -
lightY, 2));
ctx.fillStyle = "rgba( 25, 25, 30," + alpha + ")";
ctx.fillRect(x*pixelSize, y*pixelSize, pixelSize, pixelSize);
}
}
这运行得很好,我喜欢它的外观,但是当它与其他代码一起重复动画时,它显着减慢了其余代码。我认为一个可能的解决方案可能是以某种方式绘制具有较低“质量?”的渐变,我考虑的另一个解决方案是将此绘图保存在单独的画布中并将其绘制到播放器位置,但这将使其无法添加多个光源,我想通过简单地添加它们的效果来做到这一点。我可能只需要处理滞后问题,而且我对这些东西很陌生,但如果有人能帮助我,那就太好了。
为了澄清,我在绘图循环中使用此代码,并且在每次迭代中都重新计算它。我更愿意以这种方式重新计算,这样我就可以拥有多个移动的光源。
【问题讨论】:
-
我对 Canvas 了解不多,但你可以使用 CSS,可能:rgraph.net/canvas/docs/…
-
如果我们能看到你如何将它与你的渲染循环集成,那么回答这个问题会更容易。例如:如果渐变图像没有变化,您可以将其缓存在虚拟画布中并使用 drawimage 将其放在画布上。如果您在渲染循环内调用 document.getElementById,这可能会减慢您的代码,您可以通过在循环外执行此操作来加快速度。
-
感谢您的建议。希望编辑能解决问题,对此感到抱歉。
-
你可能想要迁移到 WebGL,为此我建议使用 Pixi.js
-
@aptriangle 我认为调用
document.getElementById不会对性能产生任何严重影响:stackoverflow.com/questions/12514970/…。
标签: javascript html5-canvas radial-gradients