I have a very large scene with 500 meshes on screen at once. There are only actually 15 different meshes and 15 materials so I’m wondering if there’s a way to make it so that the number of draw calls is reduced to the 15 instead of each object being rendered individually. Appreciate any help
You need to use instanced meshes. There are two major approaches:
- InstancedStaticMeshComponent: this component can create multiple instances of one StaticMesh. If your meshes have LODs, use the HierarchicalInstancedStaticMeshComponent, which supports individual LOD transitions for each instance.
- Using the foliage tool (easier to use): the foliage system isn’t limited to actual foliage and is also very good for placing lots of meshes on a scene. It allows you to place individual meshes and set their coordinates manually as well, so you can craft your scene. The foliage system uses hierarchical instanced static meshes under the hood, so all meshes placed through it are instanced.
Yeah that definitely did it (HICM did the trick). Thanks for the help. Doubled my framerate and now the scenes look absolutely unreal, no pun intended. I figured out a technique to make assets look incredibly unique and colorful and now the game is just a sight to behold.
Just finished writing a post on some of the various options http://www.casualdistractiongames.com/single-post/2017/01/07/UE4---Overview-of-Static-Mesh-Optimization-Options
There’s been a few live streams where they talk about HLODs and instancing, here’s an example from their Bullet Train demo (1:05:30).
How does ISM / HISM / LOD and other tricks compare with ‘Merging Actors’ etc…
Any benchmarks on this???
Well I managed to get 3000 objects on screen with 4 LODS on each one using HICM. 70fps with 3000 non moving objects and 50 moving actors.
gtx 960, i3-6100
They are different tools for different use cases. Rendering a merged actor uses a bit less GPU and CPU processing than instances, but uses more memory since it stores actual copies of the geometry data. Merged actors are also culled as one large mesh, so the whole thing is rendered even if only part of it is visible. It all depends on your scene needs.
Good point… Cheers