reckfellENGINE

Particle emitters: timing, capacity and visibility

Emission, OneShot, pause, bounds, coordinate spaces and drawing cost.

On this page

Start by identifying what you need to change: how many particles can exist, when they are born, how their simulation advances, or how their geometry is drawn. Emitter timing is separate from ParticleProcessMaterial forces and from the mesh surface material.

Capacity and emission

PropertyMeaningPractical consequence
AmountParticle capacity for the system; at least 1.Changing it reallocates particle data in the current RenderingDevice implementation. Do not animate it as a cheap density slider.
AmountRatioEmission fraction of that capacity; use 0–1.Changes birth participation without reducing the allocated Amount capacity. It is not a command to erase every already-live particle.
EmittingWhether new particles are being emitted.False is not the same as an empty render or paused simulation.
LifetimeParticle/system cycle lifetime in seconds; positive.Affects the birth schedule and how long particles can remain alive.

For ordinary continuous emission with full ratio, uniform timing and speed scale 1, Amount / Lifetime is a useful nominal particles-per-second estimate. A burst, changed ratio, random timing, custom shader or different time scale changes the interpretation. Do not equate the estimate to an exact count of onscreen particles.

Burst timing and completion

  • OneShot emits one cycle rather than looping. Use it for impacts and pickups; connect Finished before triggering when completion matters.
  • Explosiveness = 0 spreads births through the cycle; 1 concentrates them at its start. Intermediate values compress the birth interval.
  • Randomness varies emission timing. It is not the same control as ParticleProcessMaterial velocity/scale randomness.
  • Restart() explicitly starts a fresh cycle and clears old state. It can deliberately interrupt a running effect; waiting for Finished is a pooling/lifecycle choice, not a requirement for every retrigger.

The native scene tracks a one-shot active interval from Lifetime and Explosiveness; it does not make Emitting an exact “all particles are dead” query. In the tested explosive burst, emission is already off while particles are visible. A manually stopped continuous effect drains without the one-shot Finished notification.

Calling Emitting true again in an active one-shot can cancel that cycle's completion notification. Prefer Restart for a deliberate replay. UseFixedSeed and Seed help repeat a setup; Restart's keepSeed option preserves the current seed. Cross-device bitwise determinism is not promised.

1.0.0 timing limitation: after a long SpeedScale = 0 pause and resuming to 1, the tested one-shot can emit Finished while GPU particles are still visible. The scene timer multiplies accumulated elapsed time by the current speed scale; it is not a GPU-expiry fence. Do not recycle a time-scaled effect from this signal alone. Keeping a simple one-shot at fixed speed avoids this particular pause/resume case; validate a separate lifecycle policy when changing simulation time.

Simulation time is not render FPS

ControlUseLimitation
SpeedScaleScale simulation progression; zero pauses ordinary progression.Existing particles can still draw. Camera motion and local emitter transforms can change the image.
PreprocessAdvance startup simulation so a continuous effect begins populated.Extra simulation work can create a loading spike; it is not a free cached frame.
FixedFpsChoose the simulation step frequency.Not a cap on the whole game's render FPS, and not the same as changing SpeedScale.
InterpolateSmooth rendering between fixed simulation steps.Does not add collision simulation steps or guarantee correct fast collisions.
FractDeltaAccount for fractional birth timing within a step.Does not replace an adequate simulation step for the effect.
InterpToEndBias particle state toward the end of its life.A separate control from timing randomness and fixed-step interpolation.

The ParticleBurst example in creating a particle effect demonstrates SpeedScale zero from stable rendered pixels. The remaining step/preprocess controls are source-reviewed here; this guide does not claim a benchmark or visual comparison for every combination.

Visibility bounds are not particle collision

VisibilityAabb is an emitter culling bound. If the bound is outside the camera view, the whole effect can disappear even when its simulated particles would be onscreen. The box is not a per-particle clipping volume and does not make particles collide with its walls.

Build a bound for the whole expected trajectory plus draw-mesh size, including moving emitters, gravity and any trail extension. CaptureAabb reports current active bounds, useful as evidence from a running effect, not proof of every future frame. Revalidate after changing velocities, lifetime or spawn shape. An oversized bound reduces culling efficiency.

LocalCoords controls whether particle positions follow the emitter transform or live in world space. Choose it before tuning the bound; the same apparent motion can require a different envelope.

Drawing and cost

DrawPass1–4 select meshes used to draw particles. They are not the simulation material. Additional passes and detailed meshes increase drawing work; large blended cards can be expensive from overdraw even with modest Amount. Sharing a ParticleProcessMaterial also shares its settings; duplicate/create a separate resource when effects need independent values.

For cutouts or blended smoke, configure the surface material's transparency and texture/vertex-color use. Particle draw ordering can help some overlap cases but does not provide general order-independent transparency between all effects and world surfaces. See rendering limits.

CollisionBaseSize is a particle-collision size control, not the mesh scale or VisibilityAabb. Particle collision requires its own collision setup; placing an ordinary gameplay body nearby is not enough to assume support. SubEmitter is not “create a new child Entity for every particle”; use the sub-emitter workflow when that is needed.

Tune in a useful order

  1. Make one simple effect visible with a known camera, material and sensible bound.
  2. Establish its motion, lifetime and coordinate space.
  3. Set capacity and density, then time/spread the burst.
  4. Replace test geometry with the real effect assets and configure surface color/alpha.
  5. Measure representative overlapping effects, not one isolated emitter. Check the target renderer/device and motion before lowering simulation frequency.

Runtime coverage for this guide is the companion GPU example's emission stop, one-shot completion, restart, pause, coordinate spaces and AABB/draw-pass checks. AmountRatio density evolution, preprocess cost, fixed-step/interpolation combinations, collision, sub-emitters, trails and platform exports remain separate validation.

Reckfell Engine documentationBack to top ↑
QUICK LINKSGetting startedEntity hierarchyC# & .NET 10Scenes and prefabs
Reckfell guides and full API K
reckfellENGINE
RECKFELL ACCOUNT

Sign in

Sign in to your Reckfell account.

One account for the entire Reckfell platform.