SetActorLocation Performance - Moving +200 static mesh actors

Hi folks, I’m developing an interactive experience where new static meshes are loaded from .fbx files and spawned periodically, potentially getting into the hundreds.

I have been trying different techniques to make these actors move interestingly, without nuking framerate.

1- Physics Simulation: I tried an n-body physics simulation but for more than 10 bodies I figured it needs to be calculated in cpp or a compute shader. Running nested for-loops in blueprints totally kills FPS

2- Radial Force: pulsing from negative to positive force to attract/repel actors seems to perform well with a couple hundred meshes but I have very little control over the animation. Actors bounce back and forth instead of having the smooth “floating” effect I’m after.

3- Reading particle positions: I’m testing having a Niagara simulation, and then a BP that reads one particle positions for each actor and passes that data. Again the issue seems to be Blueprint tick, cause even if positions are calculated in Niagara I’m still updating each actor’s position via blueprint.

4- Fake orbiting: combining perlin noise with an offset sin/cos gives each actor a wobbly, unique orbit around a center. This seems to be the most performant even if I’m updating each actor’s position per tick, but the least interesting.

Should I look into Chaos Rigit Bodies instead? Should I use a different technique to update transforms that is more performant? Any ideas are mostly welcome.

If they have a collision, it can be expensive… If the collision is disabled, then problems will arise when the number is already thousands.

Not sure, but you can try using World Position Offset (or something like that) in the material to change the position visually, it will probably be much faster than Set Actor Location.
But in this case you won’t be able to use collision anymore.