World Partition not taking Z space into account

We figured out the problem a few days before 5.0 branch was updated and confirmed our problem. We were overwhelming the video card.

So we did a deep dive on performance and optimization starting with Virtual Textures. We VT’d as much as possible. This improved things but still not enough to run in 2560x1440 in Very High settings. Even in High or Medium settings we could still overwhelm the video card.

We looked at NVidia DLSS and AMD FidelityFX. We were a little disappointed in NVidia DLSS and it’s limitations. Not sure what the plan is there. However AMD FidelityFX WOW! Works cross platform, cross video cards and is open source.

And thanks to:

AMD FSR 1.0 for Unreal Engine 5 - (AMD FidelityFX Super Resolution) for porting it to UE5. Tested it on Mac OSX Big Sur and Windows. Definitly looking forward to 2.0 being released. This allowed us to reduced the secondary screen buffer and we could now run for awhile at 2560x1440 with

DefaultEngine.ini

[/Script/Engine.RendererSettings]

r.FidelityFX.FSR.Enabled=True

r.TemporalAA.Upsampling=True

r.TemporalAA.Algorithm=True

r.SecondaryScreenPercentage.GameViewport=70

r.TextureStreaming=True

r.VirtualTextures=True

r.VirtualTexturedLightmaps=False

r.VT.Residency.Notify=1

r.Streaming.DefragDynamicBounds=1

DefaultScalability.ini

[TextureQuality@3]

r.Streaming.MipBias=16

r.Streaming.AmortizeCPUToGPUCopy=1

r.Streaming.MaxNumTexturesToStreamPerFrame=1

r.Streaming.Boost=1

r.MaxAnisotropy=8

r.VT.MaxAnisotropy=8

r.Streaming.LimitPoolSizeToVRAM=1

r.Streaming.PoolSize=2500

r.Streaming.MaxEffectiveScreenSize=0

r.ScreenPercentage=77

Still not enough. So next step we created a DataLayer Loading Trigger Volume. Anything that is a prop in a room is put on it’s own data layer and when the player enters the trigger volume, we load and unload it at runtime. This seems to be working well. And lets textures get unloaded as nessessary.

We’re using 3 grids. Far, Mid and Near. Far is mostly architecture and will be used with HLODs. Current cell size is 6400 and loading range is 9600 with plans to change it to 6400 once HLODs are in. Mid cell size 3200 loading range 4800 and Near 1600 loading range 1600. We where using Near for props and such that we’ve moved to DataLayers now. So Near is used for decals, garbage on the ground, set dressing and stuff like that. So we plan to test it with a cell size of 3200.

With World Partition we found you need to have enough range between the loading ranges so you don’t try to load too many cells at the same time or you overwhelm the video card.

We will be introducing side loadable (instanced) levels so that we can unload the main streaming world. Seems to be the only way to clear the cache. We also had to drop back to DX11 as DX12 seems to overwhelm the video card faster and turned ray tracing off for now.

We had also forgotten about some work around we put in place during Early Access to combat some Lumen stuff that wasn’t finished. This included a secondary directional light (no shadows) and a post process volume that went over the entire level. Removing this got our WOW resolution and sharpness back up, solved our lighting (darkness) problem while bringing back the blackest of blacks. The directional light intensity during EA was set to 0.25, which is trash now. Setting it to the default intensity of 10 has made things look a lot better. And we need to do another lighting pass again, but we knew this going into to EA and being on the bleeding edge.

Video: UE 5.0.3 AMD FidelityFX TemporalAA.Upsampling - YouTube

Screenshot: ALARM_20220607.png - Google Drive