As I understand it, World Partitions (WP), HLODs and Nanite can all be used to improve rendering distant / large actors like landscapes.
Though they are all well-documented individually I find it near impossible to get a grasp on how they compare: which to use in a given situation; is it possible (and does it make sense) to combine them: how, where, and where not …
It’s a lot of information to take in, the terms can be confusing and they change between UE releases. It took me some time to realise the difference between ‘world composition’ and ‘world partition(s)’ and I’ve still not found out if HLODs are the same thing as LODs in general, or if they are a specific feature of World Partitions.
To make it more concrete: I have a project with a 8129x 8129 landscape (64 km^2).
Right now the landscape is a single actor. This works when playing the game, though I needed to increase the texture streaming poolsize. Editing the landscape to add details is tedious and painfully slow, though. So it would be helpful if I could improve performance a bit.
I tried converting the landscape to use Nanite, but that invariably crashes the editor.
I found several videos showing how to use Nanite on a landscape, others showing how to use WP; and one specifically explaining how to make HLODs work with WP (though that one was about a pre-release version of UE5.1).
But I can’t find anything about how those different techniques compare. It’s as if they are mutually exclusive (or worse … ) because nobody mentions them together.
It’s still better to risk asking stupid questions than wasting days on something that can’t possibly work, so (takes a deep breath) here goes:
are HLODs a feature or WP or is it the same thing as LODs - aren’t Levels of Detail ‘hierarchical’ by definition?
is there any benefit (performance or otherwise) in using WP on a level having a 8129 x 8129 landscape?
… and in using HLODs?
… or in using Nanite (for the landscape actor)?
does it make any sense to combine WP with Nanite?
when using WP, is it possible to convert the landscape tiles to Nanite one at a time, so the editor doesn’t suffocate on it like it does on the whole thing?
Target platform is pc, but not just high-end gaming machines.
I try do answer you some of the questions, but before saying anything … yep, the landscape system is in a bad shape. I also encounter all these problems as you and can’t find a fix for it, but that’s how it is at the moment.
are HLODs a feature or WP or is it the same thing as LODs
HLODs are not a world partiton feature, but they are used by the world partiton system - as every other actor. High res meshes get streamed in on close range and HLODs get loaded in the background. HLODs are categorized into different categories like instanced, merged etc. but in a nutshell it’s just a simplified version of the original mesh to reduce drawcalls, memory usage, complexity etc.
is there any benefit (performance or otherwise) in using WP on a level having a 8129 x 8129 landscape?
In theory, yes. But as far as I can see it - no. Same bad performance on my end. When I add a simple, non deformed landscape (4km) I loose roughly 40 fps on a 3090. Same with 8k, with world partiton on or off. I would still recommend to activate it, because beside the landscape stuff, it really enhance the cost of other actors.
and in using HLODs?
Yep, use HLODs. Especially important for all the assets that get scattered like big rocks and such.
or in using Nanite (for the landscape actor)
does it make any sense to combine WP with Nanite
Nanite is another system that should be used for everything else, but as you mention on a 8k landscape it crashes. That’s a really big problem for me right now and a mystery why 24gb of vram (+ shared GPU memory) is not enough to perform such task. But in theory it’s a plus and does not interfere with HLODs etc.
But I see where your question come from, since Nanite is able to perform mesh reduction on the fly. But mesh density isn’t everything. It still makes sense to switch a nanite actor with HLOD. For example materials do also get simplified and this saves performance.
when using WP, is it possible to convert the landscape tiles to Nanite one at a time, so the editor doesn’t suffocate on it like it does on the whole thing?
Would also love to know, because right now, as mentioned, it’s simply not possible to use this feature.
Since you have already read the last post, I want to to get sure you get notified by this post here. I could find a way to compute nanite for a 8k landscape.
Thank you @gestoryscht, that is very helpful. I’ll create a copy of the level and try and convert that to use WP, and see how that goes.
I’ll post it here when I know more.
Maybe the reason for the editor crashing on converting a landscape mesh to nanite is that it must load the whole thing in memory. This would work for smaller assets, but I can imagine that that would be a bit much in the case of an 8K landscape mesh .
First, don’t measure performance in “frames per second loss.” Going from 340 fps to 300 fps is very different from going from 42 fps to 2 fps. Measure frame times in milliseconds, because that is directly comparable.
Second, it’s very unlikely that the landscape is causing your GPU to bottleneck. I would bet money that the limitation is the CPU, not the GPU. I could be wrong, but this is what my experience tells me. Thus, you might want to run a variety of benchmarks (the standard ones for graphics/CPU bottleneck diagnosis) to figure out what the problem really is.
It is indeed very confusing, broken and lacking in documentation currently. I would wait until the next major ish update and have another look to see if they solved some of the current hurdles such as proper foliage support, improved data layers implementation, HLOD layers and it’s properties actually doing something (some things seem hard coded) and a bunch of other stuff I can’t get my head around.
They haven’t touched it in years if not make it worse.
Why waste time waiting. Change engine or change system.
Many alternatives that actually work out there, including voxel pluigns.
I would suggest just sticking to meshes.
Much less load overall, better slicing/partitioning and aggregating (hlod compatible at a distance).
The only thing you miss out on is the landscape grass, which you need to apply as a procedural foliage instead.
Realistic AAA project pipelines will do most of the artwork outside of the engine.
You should too, even if just a hobbyist.
Houdini works great at some of this, it even hooks into the landscape system should you want it to.
Blender requires compromising, but it also easily does a better job than the engine in terms of laying stuff out.
Importing things correctly will almost always require custom scripting either way.
And there is nothing wrong with that, since you have to curate instancing for performance as well.
@jwatte
The landscape can easily bottleneck a 4090.
Imagine an area of 200km cut up in tiles of 1km each; that’s at a minimum 200x200 draw calls on impostors before you even account for the individual drawcalls caused by the components of the 4 landscape tiles you are actively on.
… now imagine wanting for it all to render without impostors and 2x2 components at around 32x32 each tile…
Just following up on a detail here:
If you are bottlenecked on the number of draw calls, that’s a CPU limitation, not a GPU limitation.
If the performance goes up with a faster CPU, and goes down with a slower CPU, that’s a CPU limitation.
If the performance goes up with smaller window, and goes down with a bigger window, that’s a GPU limitation.
(Well, yes, there is also the “vertex shader cost” that could theoretically be a problem – if neither varying CPU speed nor varying window size changes the FPS, then that’s likely your bottleneck!)
Pretty sure the bottleneck is the gfx on large landscapes (4k rendering).
The cpu has issues too, but can handle up to 3b drawcalls OK last time I had something running (sure sub optimal fps).
It’s not a vram limitation on the gfx part either, since a larger card doesn’t offset it.
Its the speed of the card; A 4090 makes a bit of a difference to a 3090.
What does the landscape calculate on the GFX? No idea.
If I had to guess its the tris count it intrn6yoduces, but were that the case tiles would eventually just not render rather than come down to 1fps.
The landscape must be doing something gfx side like mipping down or similar that’s causing the block.