A small implementation detail made our Three.js particle playback much more predictable across phones and desktop displays: accumulate emission using delta time instead of spawning a fixed number of particles per frame.
The pattern is: add rate dt to a fractional accumulator, emit floor(accumulator), and carry the remainder forward. Clamp large dt values after tab switches, and keep a hard cap on live particles so the effect stays bounded. This prevents a 120 Hz display from emitting twice as many particles as a 60 Hz display.
We included the complete game-loop context, mobile pixel-ratio limits, object pooling notes, and a portable NixieFX runtime example here: https://nixiefx.com/threejs-game...
For teams shipping Three.js games, what has been the bigger source of variance: refresh rate, transparent overdraw, or garbage-collection spikes?
Update: we published the full Three.js implementation behind the mobile-first workflow, including delta-time movement, capped pixel ratio, object-pool guidance, and frame-rate-independent particle emission. The tutorial is here: https://nixiefx.com/threejs-game-tutorial/ — feedback on the performance tradeoffs is welcome.
Update for PixiJS teams: we documented a portable particle workflow that keeps authoring data separate from renderer integration, covers emitter lifecycle and pooling, and shows how to ship the exported effect with the open-source runtime. The guide is here: https://nixiefx.com/pixijs-particle-effects/ — especially interested in feedback from PixiJS v8 projects.
Update for teams using CI or coding agents: we published the complete nixie-fx CLI workflow for creating effects, validating projects, and exporting deterministic game bundles. The reference includes exit codes and copy-pasteable commands: https://nixiefx.com/cli-reference/ — feedback on the CI ergonomics is welcome.