So I have a rudimentary plan to make a crafting game, my comparison would be Valheim but Fortnite is also similar in theory and at least I know that was made in Unreal so it can be done.
So ideally everything in the game would be destroyable (not talking about destructible meshes here), cut down trees, knock down walls, crush boulders, etc.
I’d like specific particle effects, sounds, animations per item being destroyed and then it drops a certain type of material used for crafting walls, floors, tools, whatever.
The problem I’m having is that I know how to do all this with Actor Blueprints, but having hundreds of them in a level (which is inevitable in a open world game) absolutely destroys FPS.
How does Valheim do it where you could be standing in a forest with hundreds of trees and player made houses made from small pieces?
Or in Fortnite where a single building is obviously made with dozens if not hundreds of destroyable walls and floors?
Can static meshes be used in place of an actor blueprint and still be editable, have specific commands attributed to them? Or is there some way to only render the objects as static meshes until they’re being interacted with? Is this something destructible meshes would be used for and would that help FPS?
i forgot, they will also set the “state” of the physics object based if there’s a player nearby. For example, all objects start out in the sleeping state, until a player walks within like 10 meters of the object, then it wakes the object
I think a good thing to remember is just how much game design is basically smoke and mirrors. Not an direct answer per se; but how I handled this was using a master blueprint that handled every actor in the world using HISMs.
When the player interacted with something I would then remove the HISM and spawn a blueprint specific to what the player is interacting with.
But I am not a good programmer so it wasn’t as good as it could be and I could never quite figure out how to make it instant as having lots of hisms would cause a slight hitch when being destroyed from it’s array.
I could never quite figure out how to
make it instant as having lots of
hisms would cause a slight hitch when
being destroyed from it’s array.
Instead of removing the instance, you update its transform only. You move that instance where the player cannot see it / interact with it; and only then spawn in a new actor. The data is on the GPU, it costs virtually nothing, the HISM needs no other updates, and also does not need its state flagged as Dirty.
As a bonus, you get to keep the index order. Although this depends on culling in case of HISMs.
could you (or someone) explain the proper workflow to achieve this properly?
In a previous project I used the player BP to detect foliage static meshes nearby using tick and replace them with interactable skeletal mesh BPs (so they would move/get pushed by the player) and then on the skeletal mesh BP I’d use tick again to determine if the player was far enough away to revert to a static mesh again.
I’m under the impression that tick is something of a last resort and shouldnt be used like this though, as in an example like this, there could be dozens of BPs in range all using tick. Moreso even, if I were to make a multiplayer game, with lots of these BPs in range of multiple characters.
How does a game like ARK do it, where theres dozens of players running around and blowing up extremely complex player made castles without (much of) a hit to FPS?
I know about LODs, distance culling and using ISMs, I’m specifically asking about the BP scenarios and how to achieve having hundreds of BPs on screen/in range at one time.
Hey I know this is old, but if you are still around I am curious if you are certain of this performance scenario you mentioned.
I have 16 different HISMs that each have roughly 20,000 instances each (around 350,000 total instances). I was getting a hitch removing the item from the array on swap and had the same idea you did: Update the scale to 0 instead, and back to original if I need it back.
However I get the exact same hitch if I update the transform that I do if I remove it from the array. This is in-editor and I plan to test it in a cook, but I am curious if you are certain that updating a HISM instance transform in a large array has nearly no impact at all.
My code previously was removing the instance and that caused a hitch. When I changed it to modifying the transform the hitch is exactly the same.
When I made my little 5.2 test I had to generate 100k instances to see the hitch. I did 20k at first and didn’t see one (like your test here). But my game implementation is 16 HISMs for between 20-25k each for a total of 350K or so.
It is curious that you can use “Hit Item” from the HitResult. In my “On Hit” code above that data does not reflect the instance hit. I have to do that sphere trace trick to find the instance index.
Here is 100K instances using RemoveInstance.
I was hoping to simply “hide” the swapped instance somehow and schedule it for removal from the savegame during the next load game. When I thought of the idea of setting the instance scale to 0 and then found multiple threads here on the forum suggesting just that (including this one) I thought I had found the answer.
What makes you feel that modifying a HISM Instance transform undoes its benefits? It seems like that is the defacto way to simulate its removal. We know removing it is heavy because it causes a reorder of the entire HISM array.