I’m not sure what you mean by “should.”
The relevant code within GPUParticleSystem is within render(), so this happens each particleSystem “frame”:
this._accumulatedCount += this.emitRate * this._timeDelta;
if (this._accumulatedCount > 1) {
const intPart = this._accumulatedCount | 0;
this._accumulatedCount -= intPart;
this._currentActiveCount += intPart;
}
this._currentActiveCount = Math.min(this._maxActiveParticleCount, this._currentActiveCount);
if (!this._currentActiveCount) {
return 0;
}
Where this._maxActiveParticleCount is from the capacity parameter to constructor.
In words, each render call _accumulatedCount is increased by updateTime * emitRate and when that value is strictly greater than one, the number of activeParticles is increased by that amount until the there are capacity number of active particles. The number of active particles is the number in view (generally). When a particle dies, a new one takes its place automatically, keeping the number of active particles constant.
The emitRate, then, is proportional to the increase in active particles on each step.
Looking through the code I discovered you can increase the number of new particles using _accumulatedCount += numberOfNewParticles. As long as numberOfNewParticles is strictly greater than one (1.1 works if you need one particle). If you just want to set the number of particles, then also set emitRate to 0. I don’t see manualEmitCount actually implemented. Arguably, it should set _accumulatedCount internally on the next render() (then reset itself to 0), but doesn’t. Also, the code should perhaps check for >= 1 rather than > 1 so that one particle woukd be created.
Another function I can think of you might want to do is to add a new particle that goes away when it dies, instead of being replaced. I don’t see how to do that currently.