Now I’ve done a lot of research the last couple days and haven’t really found an answer to my question.
Say I had a team of artists and I wanted to create a city. Some buildings can be entered and have interiors (much like in The Division)
There are several modular building packs on the marketplace and most of them are just Static Meshes placed in the level stacked together. There is the benefit of occlusion culling but once I place my Player Start on the roof and look over the city, the performance drops drastically.
What would be the best way of creating all those buildings ?
A) Static Meshes in the scene, easy copy paste, Occlusion Culling, Merge Actors, LODs and HLODs (clusters) (like here: Modular Houses - Open world optimization - YouTube )
B) Hierarchical Instanced Static Mesh Component for each modular piece inside of a Blueprint, hard to edit inside of the Blueprint but high performance and supports LODs.
C) Create Modular Pieces in Maya, create buildings out of these pieces in Maya and then export as one single mesh. Then use that single mesh as HISM instance in UE4 ?
D) Another way I haven’t heard of…
The problem really is once I am on top of a Building seeing everything. I guess if that wasn’t possible in the game the answer would be A. But to me B seems to be way more efficient performance wise but definitely not very easy when I want to edit stuff and add new buildings. Also since the HISMs would be rendered all the time because there is no occlusion culling going on (afaik) I would have a constant frame drop.
Maybe if I arrange the buildings smartly I could place the ones that have an accessible roof just between very tall buildings so I don’t see that much of the skyline to avoid a lot of polygons drawn at once. What do you think ?
Can someone maybe help me with this ? I’m really really lost here. Thanks a lot for reading!
Bumpidibump. Know I know this is heavily dependent on the city layout too. I was just thinking that HISMs would really reduce the draw calls to a point where its absolutely reasonable to use them with the modular pieces.
The interiors could be just static mesh pieces since they are mostly occluded by the exteriors anyways. Any experience with this so far ?
I think you need to test out different combinations to see what works best for your setup. However, a few suggestions (what I would do):
Create your buildings from the modular asset packs - make as many combinations as you want.
Use the Merge Actors tool to create a single mesh out for the modular building
Use this single mesh inside a HISM actor (basically you will have the same building repeat multiple times in your scene so they can be instances in the HISM actor)
Build your city out of several HISM actors which contain multiple copies of the same building scattered around
Another option, do step 1-2 above but instead of doing HISM, use the Proxy LOD tool (new in 4.19) to combine far away meshes and reduce draw calls.
Then test between the 2 setups and see how it performs.
Another thing to look at is Level Streaming. You can have chunks of your city streamed in as the Player moves around. You can also do the inside of the buildings as a separate level and use level streaming to load interiors.
Occlusion culling happens regardless of whether you use meshes or HISM (as far as I know). Also, make sure you use HISM (not ISMs) as you can specify a culling distance in the properties (default is 0 so they never cull).
Alright, testing these two different approaches seems to be a good idea. As for the HISMs, a UE4 Dev once stated the following:
"HISMC vs ISMC
ISMC’s render all of their instances or none of them (if they are offscreen or occluded). HISMC’s are internally culled so that if most of the instances are off screen or beyond the cull distance, then most of them are not rendered.
ISMC’s choose one LOD for all instances; this does not work well. HISMC’s internally make LOD decisions so some of the instances can be at each LOD.
HISMC’s supported dithered temporal LOD transitions; no popping.
HISMC’s in 4.7 do NOT support occlusion culling very well…as well as ISMC’s, but the problem with 4.7 has to do with the foliage tool. In 4.6, the foliage tool would create multiple ISMC’s and these would be culled (including occlusion culling) as normal. The number of ISMC’s created was related to the cluster size. For small instance counts this could work quite well. For a million instances, clusters would be both too big and too small; you would neither get good culling, nor good CPU performance. With HISMC’s, this is fixed; there are no clusters and the foliage tool only creates one component, however, that means all million instances have only one occlusion query; so if you are in a cabin in the woods you are still going to be rendering the entire forest. This is fixed in 4.8.
HISMC’s remain a bit rough in 4.7 but they should be usable and unless you have very few instances with no LOD occupying a small part of the world, they will be superior both for CPU and GPU costs…though dithered LOD transitions are not free."
So there seems to be no occlusion culling for HISM Components, only Frustum and Distance Culling. Thanks for the Proxy LOD Tool, haven’t heard of this feature yet. Ok so it seems I have to do some tests to see what works best. Thanks for the info!
Definitely! Maybe the best approach would be to create the buildings out of modular pieces and then only combine the sides of the buildings. For a common house these would be 4 sides, 2 are visible most of the time and the other two are culled. That way I only have 2 draw calls per building. Let‘s try
I know this is necro, but in case anyone else comes along…
I’ve had a lot of success applying the Mesh Merge tools and HLODs getting a large scale city to work and still be performant.
Sure, making all the HLODs takes ages (hint, to save time at the cost of performance, don’t merge materials - use VTs, is seems to be just as fast and saves textures in the final build) - but it worked really well in the end.
Here’s a little video… Taken on a 1060 with OBS running and encoding as well - so not bad overall.