What I noticed time ago was that hidding actors using maxdrawdistance is not the same that perform a setHidden on them.
For example the foliage tool has it’s own maxdrawdistance option, but even hidden using that, they are casting shadows. Why? I don’t know. Even the hide clusters was in the other side of the map, outside the sun cascade shadow radius, they was wasting resources heavily.
For that reason I did a function to apply a SetHidden(true) for the far clusters and the difference in performance is big.
For skeletalmeshes I do the same. Maxdrawdistance on meshes has the same problem. So I send the far pawns to a “sleeping” state in the controller, and here I do a sethidden on the pawn.mesh, and pawn.setcollision(false), and pawn.settickisdisabled(true). That improves a lot, but still takes a 0.1 ms for each 100 sleeping pawns (and I have about 1000 in the map). Controllers seems to no have significant impact in the performance in this state.
Also I did a function to store the pawn properties (a struct) in an array, then destroy the far ones, and spawn again when they are near. In each tick some array entries are checked to spawn the near ones or hide the far ones. It’s faster than using the sleeping state, but I don’t know yet if the constant destroy/spawn it’s a good idea. With the grass has some crashing problems, so I will need to reuse the meshes instead destroy/spawn.
Other ideas are to check regulary all the dynamics actors to set tick or untick by distance, and the sethidden. And the stream levels.