Optimizing Collisions within Niagara

Collisions are one of the most expensive aspects of Niagara. I’ve found several ways of optimizing them, but they are still quite challenging to optimize. Below I’m going to share some of the things I’ve used for optimization. I hope that if other people have some ideas that they might also share them.

-Scalability Settings
–Culling systems with visibility and distance

-bool comparison within the collision enable parameter of a collision module
–if using warmup
—bool comparisons can be helpful to disable collisions until just before the warmup is complete. This can reduce hangs significantly.
–using time since last rendered can disable collisions while they are not visible

-General collision module settings
–using analytical planes instead of ray traced collisions.
—this can be impractical depending on the detail of your environment, but where possible this can provide substantial savings

-Using GPU particles for collisions
–GPU particles are dramatically more efficient with collision, unfortunately, as far as i know, they are not usable when you also need collision events. This is, of course a bit disappointing.

Other Notes:

I have not found “CPU trace vector length multiplier” or “max CPU trace Length” to be particularly helpful even though their tool tips claim they can be used to optimize perf.

Obvious things like keeping collision counts low and limiting the lifetime of colliding systems are of course very helpful.

It is disappointing to me that per particle attributes are not more accessible for culling purposes within either bool comparisons or scalability settings. This would offer a pathway to significant savings and it is something I have found very helpful within other engines.

4 Likes