File information

Last updated

Original upload

Created by

PFCacklefanny

Uploaded by

pfcacklefanny

Virus scan

Safe to use

Tags for this mod

About this mod

You can make the deck do it! Complete your own journey into madness today! Mod Description is a full setup guide

Permissions and credits
Changelogs
STALKER 2 STEAM DECK PORT AMATEUR EDITION

TL;DR It's an engine.ini for the Steam Deck, but if you want the full "port" idea then you'll need to follow the rest of the setup guide.  Notes about performance/behavior are in Part 3.  The goals were, 40-45fps in the outdoors, preserve visual fidelity, reduce input lag.

PART ONE: A NU

Since STALKER 2 came out I have been trying out different things to see if I could get the game working on the Steam Deck.  Back in 2007, I bought Shadow of Chernobyl at a time when I didn't know what laptops were, and spent an unbelievable amount of time crash coursing myself into Computers so I could see the bloodsucker in dx9 mode.  I beat that game four times, at 24 fps, 1024x768, on a trackpad. 

I tried installing STALKER 2 on my steam deck and when I saw it hovered around 24 fps, I heard deep within my mind the sound of cracking thunder, and when I awoke, a file had appeared on my computer.  When I opened the file, and saw before me a great list of words and numbers I did not know, I heard again within my mind a great, bellowing voice.  "GET OUT OF HERE STALKER", it said, and I passed out.

When I awoke for the second time, I found myself covered in sweat, naked on the floor.  Next to me, was my Steam Deck, and from it I could hear the sounds of combat.  My body aching, my vision blurry, I rose and turned and saw upon the screen, STALKER 2 running at an acceptable framerate.  I come to you now, a humble servant of the divine, to share with you the secrets bestowed upon me.

PART TWO: CHEEKI BREEKI
(do all of this for the best experience)

Before you play, you might find the game feels more responsive if you reduce the deadzones on the sticks a little bit.  Try it and see what you think.  I set mine at 6192.

Before you start, switch to Desktop Mode, and install this downscaled texture pack:  https://www.nexusmods.com/stalker2heartofchornobyl/mods/707.  Check the comparison images, the difference isn't very large and on the deck's screen practically imperceptible during normal gameplay.  Just follow what's in the Description.

Download and install this mod:  https://www.nexusmods.com/stalker2heartofchornobyl/mods/7.  On the mod's description they say not to use this with an engine.ini file.  It's possible some of what I've done is affected by this in ways I don't know about, or vice versa, either way just do it.

Download engine.ini from this mod, and install it here:  SteamLibrary/steamapps/compatdata/1643320 (the number could be different, sort by Date Modified if you recently launched the game to help find it)/pfx/drive_c/users/steamuser/AppData/Local/Stalker2/Saved/Config/Windows.

OPTIONAL, READ IT AND DECIDE:  https://medium.com/@a.b.t./here-are-some-possibly-useful-tweaks-for-steamos-on-the-steam-deck-fcb6b571b577.  These changes will get you slightly better performance in most things, but may not be for folks who play online a lot.

Next, follow this video guide to install DLSS Frame Generationhttps://youtu.be/wPSMWii0T7g?si=alQGbsz_24-lbwUl.  It walks you through the whole process, and you'll be back in Gaming Mode by the end of it.

OPTIONAL AGAIN You can try to undervolt the deck to improve your 1% lows.  Many guides exist, it's pretty easy to access and change in the BIOS.  Just about any guide is going to go through how to do it and what to expect, the more you can accomplish the better with it/good luck in the silicon lottery.  I got 30/30/30, if I went higher with any of them the game tended to crash/the system would reboot sometimes.  Post yours in the comments and I will tell you something about the future.

When you launch the game, at least as of 1.1.2, there's a good chance the game will crash on the shader compilation screen.  You can spot it ahead of time, because the text will freeze/the radiation wheel at the bottom stops spinning, and it doesn't resume after about 5 seconds.  The game will launch eventually, just gotta keep trying.  Try making the spirits happy.  More mods will probably make it more likely to crash, but it can do it.

Once in game, hit the 3 dot button and set your fps limit/refresh rate to 45fps/90hz.  Make sure you aren't limiting your TDP or GPU clocks.  Exit the menu.

Go to Options - Display.  Set the game to Fullscreen [Exclusive], and the resolution to 1152x720.  You can mess with the Aspect Ratio and FOV to your taste.  The original games were at 75 if I remember correctly, personally I think I actually prefer it lower on the small screen.

Go to Graphics.  Use the Low preset to get all the options set, then make the following changes:

Texture Quality - Medium
Effects Quality - Medium
Post Processing - Medium

Sharpness - 50

Upscaling Method - TSR
Upscaling Quality - Ultra Quality
Resolution Scale - 75

Make sure you are using DLSS Frame Generation, not FSR 3.1.

Shading Quality - Medium
Global Illumination - Medium
Shadow Quality - Medium

Fog - Medium
Foliage Quality - Medium
Environmental Draw Distance - Medium

Load a save, preferably somewhere out in the middle of the Zone if you want to see the best results quickly.  

PART THREE: IV DAMKE

Most commonly, when the game loads you might see a weird shimmer when you move around - it's frame generation misbehaving, just turn it off, save, turn it on, and it should go back to normal.  DON'T use HDR.  Dark foliage will shimmer like a mfer and it's super annoying.

Outside of settlements, you should expect the game to stick to 40-45fps, with input lag about on par to how it is with frame gen turned off.  Think "bluetooth controller", that's about how it feels to me when it's all running as best it can.  You will encounter some stuttering and pop-in if you do a lot of running, but nothing too egregious (you shouldn't see whole buildings popping into/out of existence or something like that, mostly just grass).

Within settlements, the framerate can vary a lot, which will introduce moments of input lag/inconsistency.  Just how it is unfortunately.  Game updates made it better but it may well just be how the sausage crumbles long term.  The upscaler will be noisy when you exit into a bright landscape, but should quickly get its shit together.  Ghosting is mostly contained to indoor scenarios, out in the field it should be at a minimum.

The game does tend to bog down a bit over time and when you do a lot of traveling over large distances, but that tends to happen on my PC too so I think it's more the game than anything I can do something about.  You might find the game feels nicer in your hands if you decrease controller sensitivity and make the stick deadzones a little smaller.

If you're willing to take a hit to visual quality, try FSR 3.1 upscaling at 66 resolution scale.  DLSS upscaling will introduce ghosting no matter how you set it.  Don't use FSR3.1 frame gen.  It just isn't as good/I can't get it to behave the same. 

My recommended controller settings:

Controller Sensitivity: 60
Controller Aim Sensitivity: 15
Aim Assist Type: Default

The game still has its own issues, so sometimes if it seems like performance is bogging down, just reload a save, or worst case, restart the game.  Thus far, I've gone from the intro out into exploring near the Red Forest, doing quests and following the story now and then.  Cutscenes can perform pretty poorly, but shouldn't screw up/get stuck from what I can tell.

I would suggest the following mods for further graphical enhancement:

Flashlight Cast Shadows: https://www.nexusmods.com/stalker2heartofchornobyl/mods/549 (the shadows will be a bit fuzzy/blocky, and mutants will have odd colors when the light shines on them)
Painter of the Zone - Bloody Wounds: https://www.nexusmods.com/stalker2heartofchornobyl/mods/394
Painter of the Zone Better Blood Wallmarks: https://www.nexusmods.com/stalker2heartofchornobyl/mods/99
Dynamic Weather Overhaul: https://www.nexusmods.com/stalker2heartofchornobyl/mods/164  (screenshots were taken with this mod installed)

ENGINE.INI LINES IF YOU WANT TO MAKE IT YOURSELF:

[SystemSettings]
InGamePerformanceTracking.HistorySize=0
csv.BlockOnCaptureEnd=0
r.DefaultFeature.AutoExposure=1
csv.trackWaitsGT=0
csv.trackWaitsRT=0
fx.Niagara.DebugDraw.Enabled=0
r.InstanceCulling.OcclusionCull=1
r.Nanite.Streaming.MaxPageInstallsPerFrame=14
r.Refraction.OffsetQuality=1
r.VRS.Enable=1
r.Lumen.ScreenProbeGather.DownsampleFactor=24
r.Nanite.AllowWPODistanceDisable=0
D3D12.InsertOuterOcclusionQuery=1
D3D12.MaxCommandsPerCommandList=20000
r.OptimizedWPO=1
r.Shadow.CacheWPOPrimitives=1
r.HLOD.MaximumLevel=1
r.Nanite.Streaming.StreamingPoolSize=768
r.Nanite.LargePageRectThreshold=256
r.Nanite.Streaming.Imposters=1
r.Shadow.Virtual.DistantLightMode=1
r.VolumetricRenderTarget.VgnetteInnerRadiusThreshold=500 ;fixes the edges of the clouds jittering weirdly
r.Nanite.Streaming.DynamicallyGrowAllocations=0
r.Streaming.PoolSize=4096
r.RenderTargetPoolMin=1024
r.Nanite.Streaming.MaxPendingPages=256
r.EarlyZPass=1
r.MaxAnisotropy=16
r.Shadow.MaxCSMResolution=1024
r.Shadow.FilterMethod=1
foliage.DitheredLOD=1
fx.SkipVectorVMBackendOptimizations=0
r.Decal.StencilSizeThreshold=0
r.DistanceFields.ParallelUpdate=1
r.DistanceFieldShadowing=1 ;set to 1 if you want shadows in the distance
r.FastBlurThreshold=5
r.EyeAdaptation.ExponentialTransitionDistance=5
r.EyeAdaptation.LensAttenuation=1.9
r.EyeAdaptationQuality=2
D3D12.TexturePoolOnlyAccountStreamableTexture=1
D3D12.PSOPrecache.KeepLowLevel=1
D3D12.ZeroBufferSizeInMB=12
mg.CharacterQuality=2
mg.HairQuality=0
D3D12.PSOPrecache.KeepLowLevel=1
r.PSOPrecache.GlobalComputeShaders=1
r.AmbientOcclusion.Method=1
r.CompileShadersForDevelopment=0
r.CreateShadersOnLoad=1
r.Lumen.DiffuseIndirect.AsyncCompute=1
r.LumenScene.Lighting.AsyncCompute=1
r.Lumen.Reflections.AsyncCompute=1
r.Shadow.CachePreshadow=1
r.SSS.Burley.EnableProfileIdCache=1
r.DFShadowCullDFObjectUsingCascadeSettings=1
ActorSequence.DefaultDisplayRate=90 fps
ActorSequence.DefaultEvaluationType=1
ActorSequence.DefaultTickResolution=90 fps
ControlRigSequence.DefaultDisplayRate=90 fps
ControlRigSequence.DefaultEvaluationType=1
ControlRigSequence.DefaultTickResolution=90 fps
LevelSequence.DefaultDisplayRate=90 fps
LevelSequence.DefaultLockEngineToDisplayRate=1
LevelSequence.DefaultTickResolution=90 fps
MovieScene.LegacyConversionFrameRate=90 fps
r.Lumen.Reflections.SmoothBias=0.75
r.Lumen.ScreenProbeGather.TwoSidedFoliageBackfaceDiffuse=1
r.Lumen.SkylightLeaking.Roughness=0.1
r.LumenScene.FarField=1
r.SSR.MaxRoughness=0.5
RHI.TargetRefreshRate=45
t.HitchFrameTimeThreshold=88.88


[/Script/Engine.RendererSettings]
r.Shaders.Validation=0
r.CookOutUnusedDetailModeComponents=1
r.AsyncCompute=1
r.AsyncPipelineCompile=1
r.GTSyncType=1
r.DontLimitOnBattery=1
r.AOAsyncBuildQueue=1
r.Shaders.Optimize=1
r.ShaderPipelineCache.PreOptimizeEnabled=1
r.ShaderPipelineCache.ReportPSO=0
r.ShaderPipelineCache.LogPSO=0
r.ShaderComplexity.CacheShaders=1
r.ShaderPipelineCache.SaveUserCache=1
r.ShaderPipelineCache.Enabled=1
r.UseAsyncShaderPrecompilation=1
r.Streaming.UseAsyncRequestsForDDC=1
r.Streaming.AmortizeCPUToGPUCopy=1
r.Streaming.UseNewMetrics=1
r.UseFastIntersect=1
r.RHICmdCollectRHIThreadStatsFromHighLevel=0
r.RHICmdBufferWriteLocks=0
r.VolumetricRenderTarget.PreferAsyncCompute=1
r.Distortion=1
r.GPUCrashDebugging=0
r.GPUCrashDump=0
r.GPUCrashDebugging.Aftermath.Markers=0
r.GPUCrashDebugging.Aftermath.Callstack=0
r.GPUCrashDebugging.Aftermath.TrackAll=0
r.GPUCrash.DataDepth=0
r.ShaderLibrary.PrintExtendedStats=0
r.GPUCrash.Collectionenable=0
r.D3D11.GPUCrashDebuggingMode=0
r.D3D12.GPUCrashDebuggingMode=0
r.CompileShadersForDevelopment=0
s.MaxIncomingRequestsToStall=0
s.MaxReadyRequestsToStallMB=0
r.SceneColorFringeQuality=0
r.SceneColorFringeQuality=0
r.Tonemapper.GrainQuantization=0
r.Tonemapper.Quality=0
r.Shaders.FastMath=1
r.NT.Lens.ChromaticAberration.Intensity=0
r.EnableDebugSpam_GetObjectPositionAndScale=0
memory.logGenericPlatformMemoryStats=0
fx.ParticlePerfStats.Enabled=0
p.Chaos.VisualDebuggerEnable=0
fx.EnableCircularAnimTrailDump=0
r.SceneColorFringe.Max=0
r.Shadow.CachePreshadow=1
r.Shadow.CacheWholeSceneShadows=1
r.UniformBufferPooling=1
r.RHICmdAsyncRHIThreadDispatch=1
r.D3D.RemoveUnusedInterpolators=1
gc.CreateGCClusters=1
p.Chaos.PerParticleCollision.ISPC=1
p.Chaos.Spherical.ISPC=1
p.Chaos.Spring.ISPC=1
p.Chaos.TriangleMesh.ISPC=1
p.Chaos.VelocityField.ISPC=1
vm.OptimizeVMByteCode=1
net.TickAllOpenChannels=0
r.Streaming.DefragDynamicBounds=1
r.ParallelRendering=1
r.ParallelShadows=1
r.ParallelShadowsNonWholeScene=1
r.ParallelTranslucency=1
r.ParallelVelocity=1
r.ParallelSceneCapture=1
r.ParallelRenderUploads=1
r.ParallelParticleUpdate=1
r.ParallelMeshMerge=1
r.ParallelMeshDrawCommands=1
r.ParallelMeshProcessing=1
r.ParallelPhysicsScene=1
r.ParallelAsyncComputeTranslucency=1
r.ParallelAsyncComputeSkinCache=1
r.ParallelZPrepass=1
r.ParallelLandscapeLayerUpdate=1
r.ParallelLandscapeSplatAtlas=1
r.ParallelLandscapeSplineUpdate=1
r.ParallelLandscapeSplineSegmentCalc=1
r.ParallelDistributedScene=1
r.ParallelBatchDispatch=1
r.ParallelCulling=1
r.ParallelDistanceField=1
r.ParallelReflectionCaptures=1
r.ParallelReflectionEnvironment=1
r.ParallelReflectionShadowing=1
r.ParallelLightingComposition=1
r.ParallelLightingSetup=1
r.ParallelLightingBuild=1
r.ParallelLightingInject=1
r.ParallelLightingPropagation=1
r.ParallelTonemapping=1
r.ParallelPostProcessing=1
r.ParallelShadowFade=1
r.ParallelShadowLights=1
r.ParallelShadowDepth=1
r.ParallelShadowFrustums=1
r.ParallelShadowSplit=1
r.ParallelOnePassPointLightShadowRendering=1
r.ParallelCascadeShadowMaps=1
r.ParallelShadowRendering=1
r.ParallelTranslucentShadowRendering=1
r.ParallelSceneColorGather=1
r.ParallelPhysicsStepAsync=1
r.ParallelDestruction=1
r.ParallelNavOctreeUpdate=1
r.ParallelNavBoundsCalc=1
r.ParallelNavBoundsInit=1
r.ParallelNavBoundsUpdate=1
r.ParallelGameThreadInitTasks=1
r.ParallelGameThreadTickTasks=1
r.ParallelSkeletalClothUpdate=1
r.ParallelSkeletalClothSkinning=1
r.ParallelSkeletalClothBoundsCalc=1
r.ParallelSkeletalClothGather=1
r.ParallelSkeletalClothPrepareSim=1
r.ParallelSkeletalClothSimulate=1
r.ParallelSkeletalClothUpdateVerts=1
r.ParallelSkeletalClothUpdateBounds=1
r.ParallelAnimationUpdate=1
r.ParallelAnimationEvaluation=1
r.ParallelAnimationCompression=1
r.ParallelAnimationRetargeting=1
r.ParallelAnimationStreaming=1
r.ParallelAnimationCompressionAsync=1
r.ParallelAnimationRetargetingAsync=1
r.ParallelAnimationStreamingAsync=1
r.ParallelAnimationCacheConversion=1
r.ParallelAnimationCacheConversionAsync=1
r.ParallelAnimationCacheStreaming=1
r.ParallelTaskShaderCompilation=1
r.ParallelMeshBuildUseJobCulling=1
r.ParallelMeshBuildUseJobMerging=1
r.ParallelBasePass=1
r.ParallelGatherShadowPrimitives=1
r.ParallelInitViews=1
r.ParallelPrePass=1
rhi.ResourceTableCaching=1
rhi.SyncAllowEarlyKick=1
r.RHICmdUseParallelAlgorithms=1
r.RHICmdDeferSkeletalLockAndFillToRHIThread=1
r.AsyncCreateLightPrimitiveInteractions=1
r.EnableAsyncComputeTranslucencyLightingVolumeClear=1
r.DownsampledOcclusionQueries=1
MemoryManager.UseNewTLSAllocator=1
r.Renderer.UseGPUInstancing=1
r.NT.Lens.Softness.RadiusSampleCount=0
r.NT.Lens.Softness.Intensity=0
r.DepthOfFieldQuality=0
r.NT.DOF.NTBokehTransform=0
r.NT.DOF.RotationalBokeh=0
r.MotionBlur.Max=0
r.MotionBlurQuality=0
r.DefaultFeature.MotionBlur=0
r.MotionBlur.Directions=0
r.Refraction.Blur=0
r.TSR.History.ScreenPercentage=200
r.TSR.ShadingRejection.Flickering.Period=8
r.TSR.History.R11G11B10=1
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

[/Script/WindowsTargetPlatform.WindowsTargetSettings]
EnableMathOptimisations=True

[/Script/Engine.StreamingSettings]
s.MinBulkDataSizeForAsyncLoading=0

[/Script/Engine.GarbageCollectionSettings]
gc.CreateGCClusters=1
gc.AllowParallelGC=1
gc.AssetClustreringEnabled=1
r.ShaderDrawDebug=0

[/Script/Engine.Engine]
bAllowMultiThreadedShaderCompile=True

[/Script/AkAudio.AkSettings]
bEnableMultiCoreRendering=True

[CrashReportClient]
bAgreeToCrashUpload=False
bImplicitSend=False

[/Script/WInstrumentedProfilersSettings.WTelemetrySettings]
bEnableTelemetry=False

[FATHydraCrashHandler]
LogCrashReportHydra=off
LogCrashUploader=off