DLSS update and Engine.ini for foliage view distance-best reflections-reduced stuttering-improved shadows and better frame time
I set out to reduce the stuttering, improve the reflections and foliage, as well as see if I could make the image a little less smudgy (lookin’ at you Lumen). Between what I could grab from the game engine as well as online sources and Epic’s own UE5 documentation I put the following together to address these issues.
Some of you may have read my previous posts on this subject but unlikely. The game has since been updated a couple of times. I’ve taught myself an awful lot about UE5.1 (still lamenting we don’t have UE5.5 options but hey-ho!) since then. My Steam time as of writing is 138 hrs and my save time is about 52 hrs. I’ve literally spent more time testing than I have playing at this point!
I set out to reduce the stuttering, improve the reflections and foliage, as well as see if I could make the image a little less smudgy (lookin’ at you Lumen). Although UE5.5 has just been released with some incredible updates which would be super useful here we’re limited to UE5.1 toolset. Between what I could grab from the game engine as well as online sources and Epic’s own UE5 documentation I put the following together to address these issues.
Before I being the guide, please read the following caveats:
First caveat is, if you have any settings saved for this game in NVIDIA Profile Inspector, be careful what you turn on & avoid messing with ReBAR altogether. It will cause crashes.
Second caveat is, adding an Engine.ini will almost certainly cause a crash on shader load the first time you load in.
Usually it’s a BSOD. Sometimes not. Give it another try and it should work. If it gets stuck in a fail-loop, delete your shader-cache (disk clean-up will do it), restart Steam and try again. Unless there’s something else causing the crash this should work.
Third caveat is, as with all modding, make copies of any files you replace before you replace them! This has stung me far too many times in the past. If you decide to abandon modding your game, delete any files you added, replace any you
update with their originals and if that doesn’t do it, verify integrity of games.
PART ONE: UPDATING DLSS & ADDING DLSS-RR
1) Download the current release of Streamline SDK from Github – https://github.com/NVIDIAGameWorks/Streamline
2) Then download the ray reconstruction (nvngx_dlssd_3.7.10.zip) from Techpowerup – https://www.techpowerup.com/download/nvidia-dlss-3-ray-reconstruction-dll/
3) Download DLSS 3.8.1 (nvngx_dlss_3.8.10.zip) from Techpowerup – https://www.techpowerup.com/download/nvidia-dlss-dll/
4) Navigate to your installation folder for S.T.A.L.K.E.R. 2 Heart of Chornobyl. Where this is located depends on
where you’ve installed it. From here open Engine – Plugins – Marketplace – DLSS – Binaries – Third Party – Win64. You should see your
nvngx_dlss.dll. Go to the DLSS 3.8.1 folder you just downloaded & extract/copy the newer version and paste it into the folder of your
installation. Replace the file when asked.
5) Open the ray reconstruction folder you downloaded and extract/copy nvngx_dlssd.dll then paste it into the same
installation folder. You should now have the 3.8.1 nvngx_dlss.dll and the new nvngx_dlssd.dll next to each other.
6) Navigate to your installation folder for S.T.A.L.K.E.R. 2 Heart of Chornobyl. From here open Engine – Plugins – Marketplace – Streamline – Binaries – Third Party – Win64. You should see a list of files including nvngx_deepdvc.dll, nvngx_dlssg.dll,
sl.common.dll, sl.deepdvc.dll, sl.dlss_g.dll, sl.interposer.dll, sl.pcl.dll and sl.reflex.dll. Open/extract the Streamline folder you
downloaded and navigate to Streamline-main – bin – x64. Highlight all the files in the Streamline folder you downloaded which are also present in the game installation folder (listed above) and copy/paste them from the folder you downloaded into the game folder. Replace when asked.
7) Also in the streamline folder you downloaded you will see sl.directstr.dll. Copy/paste this from the download folder
into the game installation folder. You should now have the new copies of nvngx_deepdvc.dll, nvngx_dlssg.dll, sl.common.dll, sl.deepdvc.dll, sl.dlss_g.dll, sl.interposer.dll, sl.pcl.dll and sl.reflex.dll, as well as the additional sl.directstr.dll.
8) Navigate to your saved date. This will usually be in C:\ – Users – *your username* – AppData – Local – Stalker2 – Saved. From here open GameSettings and you should have a file called AppliedSettings.cfg. Open this with Notepad and search for “RayReconstruction”. Change ‘false’ to ‘true’. Save and close.
CONGRATULATIONS!
You’ve now updated DLSS to the most up-to-date version. This will improve performance/fidelity moderately, even on RTX20 series cards. Although ray reconstruction was released with DLSS 3.5 it continued to be updated and drastically improves DLSS artefacting and ghosting by replacing DLSS’s native denoisers with a superior AI algorithm. These changes will benefit anybody with an Nvidia GPU who uses DLSS/DLAA, not just the RTX40XX series owners.
PART TWO: ENGINE.INI EDITS
Some of the tweaks in this section may be beneficial to other users but this is predominantly aimed at specific hardware and specific settings. I run an RTX4080 with an i9-11900K with 32 GB DDR4 3200 Mhz RAM. I play in 4K, I update DLSS so I can use Performance wihout it looking like ass, I use framegen and I target 120 fps. I’ve tweaked these settings so my CPU is always pushing frames as fast as the GPU can handle them (95%+ utilisation). Recommended 10 GB+ of VRAM (12 GB might
do it for all those 3060 owners out these). There is a minor performance cost to these changes but I have done my best to offset this where possible. Framerates will still dip when entering settlements but the difference is alleviated almost immediately and overall the following still provide a much improved frame time compared to vanilla. I play with majority Epic settings with a few set to high. Hairstrands implementation hasn’t been optimised with cards the best so keep that to medium; it really is an arse!
I’ll guide you through the steps and follow it up with some deeper explanation and resources for those who want to tweak things the way they like it or for those just looking for some extra stability/fps.
Navigate to your Saved file again (see step 8 above) and open the file Config – Windows. You should have a list of
’.ini’ files in front of you starting with ApexDestruction.ini. Open Notepad and paste the following without quotations:
“[SystemSettings]
ActorSequence.DefaultDisplayRate=120 fps
ActorSequence.DefaultEvaluationType=1
ActorSequence.DefaultTickResolution=120 fps
ControlRigSequence.DefaultDisplayRate=120 fps
ControlRigSequence.DefaultEvaluationType=1
ControlRigSequence.DefaultTickResolution=120 fps
LevelSequence.DefaultDisplayRate=120 fps
LevelSequence.DefaultLockEngineToDisplayRate=1
LevelSequence.DefaultTickResolution=120 fps
MovieScene.LegacyConversionFrameRate=120 fps
r.VolumetricCloud.SkyAO.MaxResolution=256
r.VolumetricFog.LightFunction.Resolution=256
r.ReflectionCapture.EnableLightFunctions=1
r.TSR.History.R11G11B10=1
r.TSR.History.ScreenPercentage=200
r.TSR.History.UpdateQuality=3
r.TSR.ShadingRejection.Flickering=1
r.TSR.ShadingRejection.SpatialFilter=2
r.TSR.RejectionAntiAliasingQuality=2
r.TSR.Resurrection=1
r.TSR.Translucency.EnableResponiveAA=1
ai.Human.FlankingAlone=1
ai.SwitchWeaponIfNoAmmo=1
ai.UseBlindActions=1
D3D12.PSOPrecache.KeepLowLevel=1
D3D12.TexturePoolOnlyAccountStreamableTexture=1
D3D12.ZeroBufferSizeInMB=12
foliage.LODDistanceScale=4.5
grass.DisableDynamicShadows=0
mg.CharacterQuality=2
mg.HairQuality=0
niagara.CreateShadersOnLoad=1
r.AllowGlobalClipPlane=1
r.AllowLandscapeShadows=1
r.AmbientOcclusion.Method=1
r.BloomQuality=3
r.CapsuleIndirectConeAngle=0.2
r.CompileShadersForDevelopment=0
r.CreateShadersOnLoad=1
r.DepthOfFieldQuality=2
r.FastVRam.GBufferVelocity=1
r.FastVRam.SceneDepth=1
r.FastVRam.ShadowCSM=1
r.FastVRam.ShadowPerObject=1
r.FastVRam.ShadowPointLight=1
r.FastVRam.SSR=1
r.FilmGrain=0
r.FXAA.Quality=3
r.GBufferFormat=3
r.Lumen.DiffuseIndirect.AsyncCompute=1
r.Lumen.HardwareRayTracing.Inline=1
r.Lumen.HardwareRayTracing.LightingMode=3
r.Lumen.HardwareRayTracing=1
r.Lumen.RadianceCache.HardwareRayTracing.Retrace.FarField=1
r.Lumen.RadianceCache.HardwareRayTracing.TemporaryBufferAllocationDownsampleFactor=0
r.Lumen.Reflections.AsyncCompute=1
r.Lumen.Reflections.DownsampleFactor=1
r.Lumen.Reflections.HardwareRayTracing.Retrace.FarField=1
r.Lumen.Reflections.HardwareRayTracing.Retrace.HitLighting=1
r.Lumen.Reflections.MaxRoughnessToTrace=0.4
r.Lumen.Reflections.ScreenTraces=1
r.Lumen.Reflections.SmoothBias=1
r.Lumen.Reflections.TraceMeshSDFs=1
r.Lumen.ScreenProbeGather.DownsampleFactor=16
r.Lumen.ScreenProbeGather.HardwareRayTracing.Retrace.FarField=1
r.Lumen.ScreenProbeGather.HardwareRayTracing=1
r.Lumen.ScreenProbeGather.TwoSidedFoliageBackfaceDiffuse=1
r.Lumen.SkylightLeaking.Roughness=0.1
r.Lumen.TranslucencyReflections.FrontLayer.Allow=1
r.Lumen.TranslucencyReflections.RadianceCache=1
r.LumenScene.FarField=1
r.LumenScene.Lighting.AsyncCompute=1
r.MotionBlurQuality=3
r.MSAA.CompositingSampleCount=2
r.Nanite.Streaming.StreamingPoolSize=1024
r.NGX.DLSS.DenoiserMode=1
r.PSOPrecache.GlobalComputeShaders=1
r.ReflectionCaptureResolution=1024
r.ReflectionCaptureSupersampleFactor=4
r.SceneColorFringeQuality=0
r.ShaderPipelineCache.PreOptimizeEnabled=1
r.Shadow.CachePreshadow=1
r.ShadowQuality=3
r.SSR.MaxRoughness=0.5
r.SSR.Quality=3
r.SSR.Temporal=1
r.SSS.Burley.EnableProfileIdCache=1
r.SSS.Quality=0
r.Streaming.Boost=4.5
r.Streaming.MaxTempMemoryAllowed=150
r.Streaming.PoolSize=7168
r.Streaming.UseAllMips=1
r.TemporalAASamples=16
r.Tonemapper.Quality=0
r.Upscale.Quality=3
r.Water.SingleLayer.DepthPrepass=1
r.Water.SingleLayer.LumenReflections=1
r.Water.SingleLayer.Reflection=1
r.Water.SingleLayer.SSR=1
r.Water.SingleLayer.SSRTAA=1
r.Water.SingleLayer=1
rhi.SyncAllowVariable=1
RHI.TargetRefreshRate=120
t.HitchFrameTimeThreshold=33.32
fg.CullDistanceScale.Bushes=1.25
fg.CullDistanceScale.DistantBushes=1.25
fg.CullDistanceScale.DistantFoliage=1.2
fg.CullDistanceScale.DistantGrass=1.15
fg.CullDistanceScale.DistantTrees=1.3
fg.DensityScale.Bushes=1.15
fg.DensityScale.DistantBushes=1.15
fg.DensityScale.DistantFoliage=1.15
fg.DensityScale.DistantGrass=1.15
fg.DensityScale.DistantTrees=1.25
fg.DensityScale.Grass=1.25
fg.DensityScale.Trees=1.3”
Now you want to click in Notepad – File – Save As. You need to change type from ‘Text documents’ to ‘All files’, change the name to
‘Engine.ini’ and save it alongside the other ‘.ini’ files in the Config folder.
Now, for some more info on what all that actually means and why I’ve change it:
ActorSequence.DefaultDisplayRate=120 fps
ActorSequence.DefaultEvaluationType=1
ActorSequence.DefaultTickResolution=120 fps
ControlRigSequence.DefaultDisplayRate=120 fps
ControlRigSequence.DefaultEvaluationType=1
ControlRigSequence.DefaultTickResolution=120 fps
LevelSequence.DefaultDisplayRate=120 fps
LevelSequence.DefaultLockEngineToDisplayRate=1
LevelSequence.DefaultTickResolution=120 fps
MovieScene.LegacyConversionFrameRate=120 fps
The above tweak different aspects of how the in-game cutscenes render and are presented. Evaluation type for each must be changed to allow frame interpolation. Set the display rate/tick resolution to what you desire. Legacy conversion fps option should address the few Bink cutscenes. I say ‘should’ because for some reason UE5.1 disables DLSS framegen in custscenes! As such, Nvidia users might not see more than 60 fps at best even with these but FSR users should see them at 120 fps if the hardware can do it.
r.VolumetricCloud.SkyAO.MaxResolution=256
r.VolumetricFog.LightFunction.Resolution=256
Doubled the redolution of these volumetric assets to improve quality.
r.ReflectionCapture.EnableLightFunctions=1
Required for certain features of the lighting environment to be available and captured by the reflection environment.
r.TSR.History.R11G11B10=1
Improves the performance of the TSR implementation slightly. This will effect picture quality whilst moving irrespective of whether you’re using an upscaler other than DLSS.
r.TSR.History.ScreenPercentage=200
Necessary for proper TSR coverage after upscaling.
r.TSR.History.UpdateQuality=3
r.TSR.ShadingRejection.Flickering=1
r.TSR.ShadingRejection.SpatialFilter=2
r.TSR.RejectionAntiAliasingQuality=2
r.TSR.Resurrection=1
The above optimises TSR performance and quality. Should be useful to everyone.
r.TSR.Translucency.EnableResponiveAA=1
Improves TSR implementation on translucent surfaces (eg. water) improving reflections.
ai.Human.FlankingAlone=1
Allows human enemies to attempt to flank on their own. Feel some less experience bandits would definitely be making this error and if you’re focussed elsewhere it might actually work!
ai.SwitchWeaponIfNoAmmo=1
AI enemies will now switch to their secondary when their primary runs out. Arguably makes it slightly easier but in pracrtice doesn’t
happen as often as you’d think when switched on and adds to the immersion in my experience.
ai.UseBlindActions=1
Allows enemies to blind fire and blind throw grenades (ie. when they are behind cover and do not have a direct line of sight on the player). Again, doesn’t happen often when turned on but I keep it for the same reasons as above.
D3D12.PSOPrecache.KeepLowLevel=1
Helps prevent hitching by keeping some info cached.
D3D12.TexturePoolOnlyAccountStreamableTexture=1
This allows the engine to allocate more resources by removing other texture types into a separate pool of their own. Improves texture streaming and reduces hitching.
D3D12.ZeroBufferSizeInMB=12
Required to support higher mip streaming; tripled from vanilla. Another measure to help control stutters after improving texture
streaming.
foliage.LODDistanceScale=4.5
Improves the draw distance of all foliage assets. 5 was overkill and an unnecessary performance hit. 4 is too low and allows too much noticeable pop-in. 4.5 appears to be the best compromise.
*A quick note on pop-in; although these tweaks provide a significant improvement, there are certain foliage assets which do not
function in the same way as other. As a result, in some places certain single tress will have there own pop-in issue and specifically around buildings in the distance this issue persists to a degree. If someone else can solve this without costing more performance than most people can afford, would be great to share!*
grass.DisableDynamicShadows=0
Extremely sublte difference but I prefer the immersion and was disabled in vanilla. Negligible performance cost for ultimately very
negligible visual difference.
mg.CharacterQuality=2
mg.HairQuality=0
Have turned both of these down to save performance. There is no discernible difference in quality to vanilla and the NPC’s in this game hit the performance way too hard.
niagara.CreateShadersOnLoad=1
Helps avoid stuttering in scenes with lots of particles.
r.AllowGlobalClipPlane=1
Required for planar reflectoins to work properly. Although hardware raytracing is available through Lumen the results are less than
agreeable. Had to include SSR planar reflections to buff out the poor Lumen offering.
r.AllowLandscapeShadows=1
Turned off in vanilla and contributes to dimming around thicker areas of vegetation, especially in the farfield. Prefer the more
saturated look and dimmer feel when it gets darker.
r.AmbientOcclusion.Method=1
SSAO is way off for my personal taste. Switching to GTAO appears to not only improve performance by taking pressure off Lumen but looks significantly better and less artificially shadowed in my opinion.
r.BloomQuality=3
Turned down from vanilla to save performance. As with other settings which fall into this category, there is no discernible difference in quality.
r.CapsuleIndirectConeAngle=0.2
Personal preference to bring out the shadows around characters slightly more (although subtle). Feel free to check out https://dev.epicgames.com/documentation/en-us/unreal-engine/capsule-shadows-overview-in-unreal-engine and adjust the angle to your preference.
r.CompileShadersForDevelopment=0
Completely unnecessary additional step in shader compilation. No dev shaders are in the game and as such not needed for the shipped build. Saves a little on shader compile.
r.CreateShadersOnLoad=1
Seems silly doesn’t it? Given the shader compilation screen?? This will give the engine access to some additional shaders required which are not included in the vanilla pass. Farfield will rely on some of these.
r.DepthOfFieldQuality=2
Turned down from vanilla to save a little performance.
r.FastVRam.GBufferVelocity=1
r.FastVRam.SceneDepth=1
r.FastVRam.ShadowCSM=1
r.FastVRam.ShadowPerObject=1
r.FastVRam.ShadowPointLight=1
r.FastVRam.SSR=1
Transfers the ram budget for the associated modules to the GPU. Uses more VRAM but improves performance in-engine. As stated at the beginning, this is aimed at high VRAM GPU’s. I’m providing the extra info so you can decide yourself what to include and maybe even find some things you would prefer to change!
r.FilmGrain=0
Hate it. Ruins the image. The end.
r.FXAA.Quality=3
Turned down as not required to be so aggressive at 4K. Saves on performance. Whether you are using TAA or not, this will still effect
scenarios where FXAA has been applied to a scene by the devs.
r.GBufferFormat=3
Increased the precision of memory layout allocation to improve fidelity. Performance cost will be in actual scene rendering VRAM budget more than anything.
r.Lumen.DiffuseIndirect.AsyncCompute=1
Lumen performance is increased by utilising the async compute cycle.
r.Lumen.HardwareRayTracing.Inline=1
Will attempt to use screen traces in the visual cone before falling back on cached data. Necessary to improve reflection fidelity.
r.Lumen.HardwareRayTracing.LightingMode=3
Provides more natural scene lighting by taking all lightsources into consideration rather than the just using interpolation from the
radiance cache.
r.Lumen.HardwareRayTracing=1
Yup. This was off. Big help to Nvidia owners but will require the associated modules to be activated (see below as we go) in order to
start running those features through the RT cores. The software raytacing implementation in Lumen is a bit rubbish and a massive
performance hog. If I’m not too burned out, I’ll find a few lines which could help AMD owners as well.
r.Lumen.RadianceCache.HardwareRayTracing.Retrace.FarField=1
Whether to fire secondary traces for imperfect radiance hits. Improves reflection of objects off-screen in reflective surfaces.
r.Lumen.RadianceCache.HardwareRayTracing.TemporaryBufferAllocationDownsampleFactor=0
Turning more things on requires more memory to support it otherwise you’re in hitch-city. A value of 1 might work but I tend to stop testing when I find something that works! Give it a try if your VRAM budget is low.
r.Lumen.Reflections.AsyncCompute=1
As above, performs better when running on the async compute.
r.Lumen.Reflections.DownsampleFactor=1
Not much difference between factor of 0 and factor of 1. Start noticing the difference at 2 and above. When in tandem with the
reflection capture resolution setting to follow below somewhere this will make a big difference to planar reflection fidelity.
r.Lumen.Reflections.HardwareRayTracing.Retrace.FarField=1
Where there are incomplete/error hits on farfield objects Lumen will fire off secondary hits. This reduces noise in reflections and improves fidelity.
r.Lumen.Reflections.HardwareRayTracing.Retrace.HitLighting=1
If the engine is not certain whether a reflection hit is accurate, a secondary trace will be fired to clarify. This will do the same as
above; reduce noise and improve visual fidelity of reflections.
r.Lumen.Reflections.MaxRoughnessToTrace=0.4
This alleviates the majority of fuzziness in reflections on surfaces that are not smooth (eg. floors). Altering this will make reflections
stand out more (increasing) but will result in a lot of noise in said reflections!
r.Lumen.Reflections.ScreenTraces=1
Whether to fire screen traces first before falling back to any other method. With hardware raytracing turned on, Lumen can do this without tanking your performance. Improves reflections significantly.
r.Lumen.Reflections.SmoothBias=1
I do love my reflections looking glassy. Turning this down to 0.5 will make them 50% less glassy etc. Hypothetically should actually
improve performance but haven’t noticed myself. Makes reflections either glossy (0.0) or glassy (1.0) depending on preference.
r.Lumen.Reflections.TraceMeshSDFs=1
Turning distance fields on along with associated modules in the engine is not recommended. No combination of settings would make it worth it for the performance hit and although the contribution was noticeable in some cases, it still isn’t worth it. This turns on screen traces for mesh distant field objects so we at least see their contribution to rendered reflections.
r.Lumen.ScreenProbeGather.DownsampleFactor=16
This was set to 32 or 64 in vanilla. By reducing the downsample factor (i.e. increasing the number of samples) Lumen has a lot more info to work with and provide a boost to visual fidelity as well as reducing ghosting.
r.Lumen.ScreenProbeGather.HardwareRayTracing.Retrace.FarField=1
Fires secondary traces for uncertain farfield object hits. Improves fidelity, especially for objects in the medium to far distance.
r.Lumen.ScreenProbeGather.HardwareRayTracing=1
Runs Lumen’s probe gathering passes through the RT core line as opposed to the render threads. Necessary for all the associated modules to function properly.
r.Lumen.ScreenProbeGather.TwoSidedFoliageBackfaceDiffuse=1
Allows the contribution of back lighting to the luminance of foliage. No discernible performance hit and does improve colour in short
to medium range foliage a little.
r.Lumen.SkylightLeaking.Roughness=0.1
Sets the maximum amount of ‘roughness’ a surface can have before Lumen will check if there should be light allowed through it or not. This helps avoid light-leaking being out of control in buildings. Although r.SSGI.LeakFreeReprojection is turned on in the engine, we’re using Lumen so it’s of no help. Tried lowering to 0.01 but don’t think this is in the engin’s repertoire as an integer and just made everything worse. This setting is also influenced by having Lumen farfield enabled further down…
r.Lumen.TranslucencyReflections.FrontLayer.Allow=1
Whether to treat the top layer of water only as the reflective layer. Improves the reflections.
r.Lumen.TranslucencyReflections.RadianceCache=1
Whether to allow Lumen to look in the radiance cache for info on objects that are offscreen being reflected in translucent surfaces.
Helps make the reflections more precise, especially at screen edges.
r.LumenScene.FarField=1
Enables Lumen rendering on what the engine considers farfield details. In practice this is actually closer than you’d think. Think,
end of a dimly lit warehouse on a murky day…
r.LumenScene.Lighting.AsyncCompute=1
Sure you get the idea on this now. Runs one of the most expensive aspects of Lumen on the async pipeline which makes a big difference to performance.
r.MotionBlurQuality=3
r.MSAA.CompositingSampleCount=2
Turned down from vanilla to no noticeable degradation in quality. Saves performance.
r.Nanite.Streaming.StreamingPoolSize=1024
Double vanilla to avoid hitches in texture streaming. Most cards can handle the raster pipeline depending on resolution and architecture but Nanite adds another pass and tends to cause hitches on some cards. Turning this up helps minimise this issue.
r.NGX.DLSS.DenoiserMode=1
The actual switch for ray reconstruction as the default denoiser. Otherwise, can’t say how it was implemented before it was removed. All I can say is that it was removed, so probably not entirely set up. Turning on at runtime in the engine eliminates this.
r.PSOPrecache.GlobalComputeShaders=1
Compute shaders are poison to performnce depending on where/how they are implemented in the scene. This setting ameliorates the issue by rendering as many as the code will allow before jumping into the game.
r.ReflectionCaptureResolution=1024
Doubled the capture resolution to improve fidelity. No noticeable performance hit or real impact on VRAM that I could tell.
r.ReflectionCaptureSupersampleFactor=4
Upscale that reflection to 4K! You can play around with this and capture resolution if your card starts struggling to try clawback some performance. The upsampling is where the performance hit comes from.
r.SceneColorFringeQuality=0
Can’t stand vignette or chromatic aberration. Should be abandoned at this point in my opinion but that’s just me. You can leave this on (set to 1 or omitted entirely) at a relatively minor performance cost if you prefer to keep those effects on.
r.ShaderPipelineCache.PreOptimizeEnabled=1
Optimizes shaders before jumping into the game as opposed to letting the engine dictate the threshold depending on the scene. Avoids unnecessary hitching.
r.Shadow.CachePreshadow=1
Initial preshadow pass is usually done on a per frame basis. This caches shadows at the per scene threshold dictated by the code. This reduces a potential source of hitching and stuttering.
r.ShadowQuality=3
Turned down slightly from vanilla. No noticeable difference I can tell but it you prefer it can be left at vanilla.
r.SSR.MaxRoughness=0.5
How ‘rough’ a surface can get before the engine stops rendering planar reflections on it. This is a performance saving measure mostly and doesn’t really effect the quality of reflections per se.
r.SSR.Quality=3
There is a higher setting, but it’s just not necessary and saves a little performance. When SSR is working in tandem with Lumen running on hardware raytracing this works just fine.
r.SSR.Temporal=1
Need some AA on reflections. It fixes some of the DLSS artefacting, especially when something passes in front of the reflection.
Unfortunately, not much can be done about the missing screen information, even with screen traces and inline turned on. Would love to regress to RT but after exhaustive testing I can sadly confirm the raytracing cvars do absolutely nothing.
r.SSS.Burley.EnableProfileIdCache=1
Improves performance around NPC’s at no extra cost.
r.SSS.Quality=0
Only a slight difference in subsurface scattering quality by lowering this but in my opinion faces look less flushed and more natural
with this turned down. Saves a decent bit of performance.
r.Streaming.Boost=4.5
Boost the distance of streamed textures to improve texture quality a bit deeper into the scene. No as costly as you might think and easily alleviated by the tweaks to shader caching and pipelines.
r.Streaming.MaxTempMemoryAllowed=150
Triple the streaming memory budget in MB to compensate for the boosted streaming distance.
r.Streaming.PoolSize=7168
This is the amount of your VRAM dedicated to streaming for everything the engine is doing. This is overkill, but so are some of the settings I’ve implemented. In all likelihood you could probably get away with reducing this depending on your budget. Should be a multiple of 1024. Current representative setting above is 7 GB.
r.Streaming.UseAllMips=1
Helps avoid issues with texture popping, along with the streaming boost above. As I mentioned earlier though, there’s no helping some of the pop-in in this game!
r.TemporalAASamples=16
Doubled the TAA sample count which mostly affects DLSS when the viewport is moving around a lot. Helps with fidelity, especially in motion.
r.Tonemapper.Quality=0
Improves shader streaming by negating loading shaders associated with chromatic aberration and vignettes.
r.Upscale.Quality=3
Costs performance but improves the overall quality of the image significantly if using an upscaler like DLSS. This is the defaule UE5
setting which devs had clearly turned down to 2 for some reason; likely to save performance or improve compatibility across architectures.
r.Water.SingleLayer.DepthPrepass=1
Provides necessary depth info quickly to the renderer when the singlelayer system is activated (which it will be a bit lower) Prevents
reflections looking too degraded after upscaling.
r.Water.SingleLayer.LumenReflections=1
Get Lumen in on the water reflection action. Off in vanilla.
r.Water.SingleLayer.Reflection=1
Gotta be turned on for Lumen’s work above to mean anything or be displayed in the scene.
r.Water.SingleLayer.SSR=1
Required so reflections don’t disappear entirely when looking directly down. Provides planar reflection info from the radiance cache
to fill in the blanks when screentraces are firing at nothing. Sadly, there’s no fixing the general blurred nature of these particular
reflection instances but thankfully they’ve rarely visible/noticeable under normal gameplay (i.e. not testing where you’re looking for
imperfections)
r.Water.SingleLayer.SSRTAA=1
Enables TAA on singlelayer system reflections. Necessary overall without which the reduction in quality is too noticeable.
r.Water.SingleLayer=1
Gotta be turned on for any of the other settings to mean anything. Turns the whole singlelayer on or off.
rhi.SyncAllowVariable=1
Necessary for variable refresh rates to update properly. Useful if, like me, you prefer to force vsync on in Nvidia Profile Inspector where games force it off to enable frame gen. Makes a noticeable improvement if you have a g-syn/freesync screen.
RHI.TargetRefreshRate=120
Functions like a refresh rate limiter but functions on all aspects of the engine rather than just the display rate. Prevents any potential
for wasted overhead by limiting the tick rate altogether.
t.HitchFrameTimeThreshold=33.32
Frame time in ms that the engine will consider a ‘hitch’. This is quadruple the single frame refresh period in ms. 1 frame at 120 fps
takes 8.3 ms. So 4 frames is 33.2 ms. By reducing the hitch threshold to 4 frames the engine does a much better job at maintaining frame pacing, even under variable rates.
fg.CullDistanceScale.Bushes=1.25
fg.CullDistanceScale.DistantBushes=1.25
fg.CullDistanceScale.DistantFoliage=1.2
fg.CullDistanceScale.DistantGrass=1.15
fg.CullDistanceScale.DistantTrees=1.3
The above increase the distance at which various foliage objects switch from their highest quality LOD to a lower quality LOD. By
increasing these slightly the higher quality LOD (i.e. best texture for the object) remains visible at a greater distance from the camera. These are expensive settings so be careful!
fg.DensityScale.Bushes=1.15
fg.DensityScale.DistantBushes=1.15
fg.DensityScale.DistantFoliage=1.15
fg.DensityScale.DistantGrass=1.15
fg.DensityScale.DistantTrees=1.25
fg.DensityScale.Grass=1.25
fg.DensityScale.Trees=1.3
The same as the above but have a lighter performance footprint. Controls the density of the spawned foliage of various types. Spent the better part of a day testing and tweaking these so be careful for your performance sake!