STALKER 2 Steam Deck Port AMATEUR EDITION
TL;DR It’s an engine.ini for the Steam Deck. You can use it on its own, but there’s a bunch else you can do. The goal is to keep as much of the visuals as I could. I just threw shit together, learning as I go, and got this far. If you have feedback/suggestions, please share!
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, 1024×768, 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
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.stalker2mod.com/poor-mans-stalker-2/. 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.stalker2mod.com/optimized-tweaks-s-2-reduced-stutter-mouse-fix-improved-performance-lower-latency/. 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 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 1152×720. 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. In settlements, sometimes if a lot is going on the game can slow a bit and this will introduce some latency. Having a little bit of aim assist isn’t a bad thing either.
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.
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)
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
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.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