javascript - 有没有办法优化粒子生成算法以处理许多对象?
问题描述
事实上,我正在制作一个必须说明“影响”的背景。
我试图用粒子来制作这个,这些粒子从屏幕上的给定点生成,它们朝着随机方向移动,并且在它们拥有一段时间后爆炸。所以问题是,我以某种方式成功地做到了,但它真的很慢。放置了大约 400 个生成器,浏览器开始滞后,问题是我至少需要 400 个。那么有什么办法可以优化我所做的吗?链接在这支笔上。
我的粒子:
class Particle {
constructor(radius,speed,lifetime,aoe) {
this.speed = speed;
this.life = lifetime;
this.aoe = aoe;
}
throw() {
var r = random(TWO_PI);
var dx = cos(r);
var dy = sin(r);
var speedX = this.speed*dx;
var speedY = this.speed*dy;
return [speedX,speedY];
}
display(rootX,rootY,x,y) {
line(rootX,rootY,x,y);
}
blast(rootX,rootY,x,y) {
line(rootX,rootY,x,y);
ellipse(x,y,this.aoe,this.aoe);
}
}
这是生成器:
class ParticleGenerator {
constructor(x,y,frequency, particle) {
this.x = x;
this.y = y;
this.f = frequency;
this.p = particle;
this.pX = this.x;
this.pY = this.y;
this.state = 0;
this.wait = 0;
this.dir = this.p.throw();
}
travel(sX,sY) {
this.pX += sX;
this.pY += sY;
}
activate() {
var d = (dist(this.x,this.y,this.pX,this.pY)/this.p.speed)/this.p.life;
if(this.state == 0)
this.dir = this.p.throw();
if (this.state < this.p.life) {
stroke(255,0,0);
fill(11)
this.travel(this.dir[0],this.dir[1]);
this.p.display(this.x,this.y,this.pX,this.pY);
this.state++;
}
if (this.state == this.p.life && this.wait < this.f) {
stroke(255,0,0,255-(this.wait*255)/this.f)
fill(255,0,0,255-(this.wait*255)/this.f);
this.p.blast(this.x,this.y,this.pX,this.pY);
this.wait++;
}
if (this.wait == this.f) {
this.state = 0;
this.wait = 0;
this.pX = this.x;
this.pY = this.y;
}
}
}
解决方案
推荐阅读
- python - 无法将数组列表转换为 3D 数组
- google-cloud-platform - 如何通过 terraform 部署 gcp API 凭据?
- go - Go WASM 导出函数
- html - 如何向 ::webkit-scrollbar-thumb 添加左右填充?
- android - Android Sql 数据库不保存数据
- python - Django Rest Framework - AttributeError:'function'对象没有属性'get_extra_actions'
- neo4j - neo4j 节点属性占用的最小磁盘空间是多少?
- angular - 从 Angular 11 升级到 12 后的神秘错误消息和名称
- reactjs - 维特斯 | 未捕获的错误:动态要求“
.svg" 不受支持 - python - MacOS 上的 Python 库