I wanted to start a discussion around particle system LODs, which I feel is a deceptively complex topic. Unlike models and textures, there’s not really one simple way to reduce complexity in a particle system while retaining the same visuals. Chopping particle lifetime and count in half is going to win you performance, sure, but it will also most likely break the entire effect.
I’ve worked in some systems where LODs have been handled mostly on a systematic level, where the engine keeps tracks of how many emitters and particles exist at any one time, and does it’s best to cull and limit instances without affecting gameplay. Other engines I’ve worked in have had a more explicit approach, where the rules for when an effect should spawn, simulate, and render are all exposed for the artist to manipulate on a per effect-basis.
On one hand, I enjoy the systematic solutions that allow me to focus more on the creative aspects of effects authoring and have performance be more of a “behind the scenes”-kind of thing. But on the other hand, having explicit control allows me to fine-tune the performance with minimal visual degradation. It’s hard to say which is the better approach.
I’m curious to hear what have your experiences been!
We use a modulator system where we can tweak spawnrate, size, alpha and erosion based on distance from camera using curves. It’s quite handy since we can specify everything per emitter so things like droplets stop spawning 10m away (too small to see except really close to the camera), dust clouds can be tweaked to spawn fewer particles but make them bigger etc etc.
Cool! Do you have any LOD systems based around what the current platform is or how many other effects are playing currently? Or is it all just based on view distance?
Sort of. We’ve recently added some more tweakable parameters to scale spawnrates, near camera fade distances and a few other bits based on platforms so for example PC can have a lower near fade value and higher spawnrates than say an Xbox 1. It’s going to be interesting tweaking those values to get the best bang for buck performance wise that’s for sure
When I was working on Smite, I believe we would tie LOD levels to graphics settings, and in each particle system either turn off or lower emission on certain emitters. Another method we used was putting switches in shaders that reduce complexity, or switching out shaders with simplified versions.
I’m currently working on a mobile game with a significant amount of particles on screen. We haven’t implemented the system yet, but my plan is to set up a system where we can turn off secondary particle systems for lower spec devices and switch out more complicated custom shaders. Since it’s an orthographic camera, there is no camera distance LOD, so it will hopefully be based on device spec or “battery saver” set to on.