You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JavaScript粒子发射器中粒子添加速率高于移除速率?

问题分析与解决

你的问题出在**addParticle和updateParticles的重复添加逻辑**上:

  • addParticle函数内部已经执行了this.particles.push(p),把新粒子加入了数组
  • 而在updateParticles的判断分支里,你又写了this.particles.push(this.addParticle())——这相当于调用一次addParticle已经添加了1个粒子,外面再push一次返回的同一个粒子,等于每移除1个粒子,实际添加了2个,粒子数量自然会越来越多

修正方案

方案一:保留addParticle的自动push逻辑

只需要去掉updateParticles里多余的push操作,直接调用addParticle即可:

this.updateParticles = function() {
    // 遍历粒子并绘制到屏幕
    for(let i = this.particles.length-1; i >= 0; i--) {
        this.particles[i].drawParticle();
        this.particles[i].updateParticle();
        if (this.particles[i].age > this.lifetime) {
            this.particles.splice(i, 1); // 移除过期粒子
            this.addParticle(); // 直接添加新粒子,无需额外push
        }
    }
}

方案二:让addParticle仅创建粒子,由调用方控制添加

修改addParticle,去掉内部的push逻辑,把添加操作交给updateParticles,逻辑更清晰:

this.addParticle = function() {
    return new Particle(
        random(this.x - 10, this.x + 10),
        random(this.y - 10, this.y + 10),
        random(this.xSpeed - 1, this.xSpeed + 1),
        random(this.ySpeed - 1, this.ySpeed + 1),
        random(this.size - 4, this.size + 4),
        this.colour
    );
}

this.updateParticles = function() {
    for(let i = this.particles.length-1; i >= 0; i--) {
        this.particles[i].drawParticle();
        this.particles[i].updateParticle();
        if (this.particles[i].age > this.lifetime) {
            this.particles.splice(i, 1);
            this.particles.push(this.addParticle()); // 这里push才是正确的1:1替换
        }
    }
}

两种方案都能保证移除1个粒子就添加1个,维持粒子数量的平衡。

内容的提问来源于stack exchange,提问作者goo ster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:22:03