所以我用canvas和javascript(一些jQuery)制作了一个简单的粒子系统,但我似乎无法让它在我的旧电脑上运行速度超过8fps,这是代码:如何使用粒子对象优化画布粒子系统
var starList = [];
function Star(){
this.x = getRandomInt(0, canvas.width);
this.y = getRandomInt(0, canvas.height);
this.vx = getRandomInt(2,5);
this.size = this.vx/5;
this.opacity = getRandomInt(0, 5000)/10000;
this.color = getRandomFromArray(["239, 207, 174", "162, 184, 229", "255, 255, 255"]);
this.draw = function(){
ctx.fillStyle = "rgba("+this.color+","+this.opacity+")";
ctx.beginPath();
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2, true);
ctx.closePath();
ctx.fill();
},
this.move = function(){
this.x = this.x - this.vx;
if(this.x < 0) {
this.x = canvas.width;
this.opacity = getRandomInt(0, 5000)/10000;
this.color = getRandomFromArray(["239, 207, 174", "162, 184, 229", "255, 255, 255"]);
this.y = getRandomInt(0, canvas.height);
this.size = this.vx/5;
this.vx = getRandomInt(2,5);
}
}
}
var canvas, ctx;
function setCanvas(){
canvas = $('canvas')[0];
ctx = canvas.getContext("2d");
canvas.width = $(window).width()/5;
canvas.height = $(window).height()/5;
}
setCanvas();
function generateStars(){
for(var i = 0; i < 5000; i++){
var star = new Star();
starList.push(star);
}
for(var i = 0; i < starList.length; i++) {
star = starList[i];
star.draw();
}
}
generateStars();
function loop() {
window.requestAnimationFrame(loop);
//clear canvas
ctx.clearRect(0, 0, canvas.width, canvas.height);
//draw and move stars
for(var i = 0; i < starList.length; i++) {
star = starList[i];
star.draw();
star.move();
}
}
我假定使用对象的粒子(星)和通过物的5000索引阵列循环,并执行这两个函数是硬的处理器/ GPU但如何可以优化此代码?
我见过其他人避免在构造函数上使用函数,并在它们遍历数组时循环移动和绘制粒子。这会使它更快吗?
编辑:忽略getRandomInt和类似的功能,他们是我用来生成随机东西的简单功能。
除了它是一个不完整的列表和想法不能被测试,只是转发给你 - 看起来显而易见的一点似乎是绘制函数。 5000弧似乎需要一段时间才能画出。我会尝试绘制5000个矩形。如果速度快得多,可能仍然值得使用合成材料绘制圆形透明png来为其着色。计算弧的轮廓将会很慢,我想可能不是硬件加速。另一方面,图像混合/缩放/着色可以。以下是时间安排:https://developer.mozilla.org/en-US/docs/Web/API/Performance/now – enhzflep