Valheim Performance Overhaul
A comprehensive performance optimization mod focused on reducing CPU and GPU load — especially on large bases, busy servers, and zones with many light sources.
Installation
Install via r2modman or Thunderstore Mod Manager (recommended) — everything is placed automatically.
Manual install:
- Install BepInExPack Valheim first.
- Copy
ValheimPerformanceOverhaul.dll into BepInEx/plugins/.
- Launch the game — a config file is generated automatically at
BepInEx/config/com.Skarif.ValheimPerformanceOverhaul.cfg.
What it does
🔦 Light Culling (biggest FPS impact)
- Limits active light sources to a configurable maximum (default: 15).
- Disables shadow casting beyond a set distance.
- Light LOD system: transitions lights through Full → No Shadows → Emissive → Billboard → Disabled as distance increases.
🕯️ Light Flicker Optimization (new in 2.7.0)
- Fixes fire and torch light intensity at its base value, eliminating per-frame Shadow Map recalculation.
- In vanilla, every flickering campfire forces the GPU to fully rebuild shadow maps each frame for all objects in its radius. Freezing the intensity makes the light static — shadows are computed once and reused until something moves.
- Especially impactful on large bases with many fires, hearths, and torches.
💤 Distance Culler
- Puts distant creatures and building pieces to "sleep" — pauses their Update logic.
- Physics culling for Rigidbodies beyond a set range.
- Configurable exclusions (e.g. portals, tombstones are never culled).
🏗️ Piece Optimization
WearNTear.GetSupport() results are cached with a configurable TTL.
- Distant pieces skip their Update cycle entirely.
- Asynchronous WearNTear initialization — spreads load over multiple frames on scene load.
🤖 AI Throttling
- Monsters beyond 60 m update AI only every 5 seconds instead of every frame.
- LOS (line-of-sight) checks are cached per-target with a 0.5 s timeout.
- Idle tamed animals inside player bases enter a low-power mode.
🌫️ Smoke Physics Optimization (new in 2.7.0)
- Replaces complex vanilla smoke aerodynamics with a simple, lightweight approximation.
- Vanilla smoke particles push each other, compute volumes, and simulate accumulation under rooftops. On large bases with many campfires this creates hundreds of per-frame collision checks between particles and building geometry.
- The simplified version uses quadratic interpolation for particle mass and a single upward force — smoke still rises and fades, but at a fraction of the CPU cost.
🎨 Graphics Settings
- Configurable shadow distance, resolution, and cascade count.
- Bloom and screen-space reflections toggle.
- Terrain quality multiplier.
⚙️ Engine Quality Settings (new in 2.7.0)
- Forces low-level Unity
QualitySettings tweaks at startup:
- Soft Particles disabled — eliminates per-pixel Depth Buffer reads for particle edges.
- Soft Vegetation disabled — removes the extra GPU pass for grass and bush border blending.
- Particle Raycast Budget reduced (default: 1024, vanilla: 4096) — limits per-frame ray-casts fired by particle systems for collision checks.
- Minor visual change on particle edges; significant GPU and CPU gain on particle-heavy scenes.
🌿 Vegetation
- Grass render distance and density control.
- Detail object distance and density.
🎵 Audio Pooling
- Reuses AudioSource components instead of creating new ones per sound effect.
♻️ Object Pooling
- Reuses
ItemDrop GameObjects to reduce instantiation overhead when loot spawns.
🧠 GC Control
- Prevents Unity's garbage collection from firing during combat or movement.
⚡ JIT Warm-up
- Pre-compiles critical game methods on spawn to eliminate the first-use stutter.
🛡️ Frame Budget Guard (new in 2.7.0)
- Monitors frame times in a rolling 120-frame window (~2 seconds) and tracks the 1% Low — the average duration of the worst frames.
- When heavy spikes are detected (configurable threshold, default: 28 ms), dynamically lowers
Time.maximumDeltaTime to prevent Unity's physics engine from entering the Death Spiral: lag → engine tries to catch up physics → even more lag → multi-second freeze.
- Converts hard freezes (e.g. large structure collapse) into brief slow-motion, preserving input responsiveness. Returns to normal automatically once the game stabilises.
🗺️ Minimap Optimization
- Configurable texture resolution and update frequency.
⏩ Skip Intro (new in 2.7.0)
- Skips the Iron Gate and Coffee Stain logo screens on every game launch.
- Saves 5–10 seconds per startup. No FPS impact — pure convenience.
Configuration
All settings are available in BepInEx/config/com.Skarif.ValheimPerformanceOverhaul.cfg.
If you have BepInEx Configuration Manager installed, press F1 in-game to adjust all settings with a GUI in real time.
Key settings
| Setting |
Default |
Description |
| Max Active Lights |
15 |
Max simultaneous light sources |
| Light Cull Distance |
60 m |
Beyond this distance lights turn off |
| Light Flicker Optimization |
true |
Fixes light intensity, stops per-frame shadow rebuilds |
| Smoke Physics Optimization |
true |
Replaces heavy smoke aerodynamics with simple approximation |
| Engine Quality Settings |
true |
Disables soft particles/vegetation, reduces particle raycast budget |
| Frame Budget Guard |
true |
Prevents physics Death Spiral during heavy load spikes |
| Skip Intro |
true |
Skips studio logo screens on startup |
| Creature Cull Distance |
80 m |
Creatures sleep beyond this distance |
| Piece Cull Distance |
100 m |
Building pieces sleep beyond this distance |
| Support Cache Duration |
5 s |
How long structural support values are cached |
| Grass Density Multiplier |
0.7 |
1.0 = vanilla, lower = fewer grass blades |
| Shadow Distance |
50 m |
Maximum shadow render distance |
| Freeze Threshold |
28 ms |
1% Low threshold that triggers Frame Budget Guard |
| Particle Raycast Budget |
1024 |
Max particle ray-casts per frame (vanilla: 4096) |
Performance expectations
Results depend heavily on scene complexity. Typical gains:
| Scenario |
Expected FPS gain |
| Open world, few structures |
~5–10% |
| Medium base (50–100 pieces) |
~10–20% |
| Large base (300+ pieces, 10+ light sources) |
~25–45% |
| Busy server with many players/mobs |
~15–30% |
| Large base with many campfires (v2.7.0) |
additional ~10–20% on top |
Compatibility
- ✅ Works standalone — no other mods required.
- ✅ Compatible with most content mods (Epic Loot, Jotunn-based mods, etc.).
- ⚠️ If Object Pooling conflicts with a loot mod, disable it in config (
4. Object Pooling → Enabled = false).
- ⚠️ Light Flicker Optimization removes the visual flicker from fires and torches. If you prefer the vanilla animated flame appearance, disable it in config (
17. Light Flicker Optimization → Enabled = false).
- ⚠️ Smoke Physics Optimization changes smoke behaviour — particles will no longer accumulate under rooftops. Disable in config if this is important to you (
18. Smoke Physics Optimization → Enabled = false).
- ⚠️ The mod is in BETA. Test runs have been conducted in various situations, but it is advisable to keep world backups.
- ❌ Does not support crossplay (Steam + Game Pass mixed sessions). Pure Steam servers are fine.
Changelog
v2.7.1
Added
- mini-update (smokePatch).
v2.7.0
Added
-
Light Flicker Optimization — Harmony Prefix on LightFlicker.CustomUpdate that fixes light intensity at its base value, eliminating per-frame Shadow Map recalculation for all fires and torches. Significant GPU gain on bases with many light sources.
-
Smoke Physics Optimization — Harmony Prefix on Smoke.CustomUpdate that replaces the vanilla complex aerodynamics (inter-particle collisions, volume simulation, roof accumulation) with a lightweight quadratic interpolation + single upward force. Dramatic CPU savings on large bases with many campfires. Lift force is configurable.
-
Engine Quality Settings — Forces low-level Unity QualitySettings at startup: softParticles = false, softVegetation = false, configurable particleRaycastBudget (default: 1024 vs vanilla 4096). Minor visual change on particle edges; measurable GPU and CPU gain in particle-heavy scenes.
-
Skip Intro — Skips Iron Gate and Coffee Stain logo screens on every game launch by patching SceneLoader.Start. Saves 5–10 seconds per startup.
-
Frame Budget Guard — Dynamic stutter protection system. Monitors a rolling 120-frame window, computes the 1% Low frametime, and lowers Time.maximumDeltaTime when heavy spikes are detected. Prevents Unity's physics Death Spiral (lag → engine over-simulates physics to catch up → more lag → freeze). Converts hard freezes into brief slow-motion. All thresholds are configurable. Automatically recovers when the game stabilises.
Changed
- Version bumped to
2.7.0.
- README updated with new module descriptions, expanded compatibility notes, and updated performance expectations table.
- Config sections renumbered: new modules occupy sections 17–21.
Notes
- All new modules are enabled by default and can be individually toggled in config.
- Light Flicker and Smoke optimizations are Prefix patches with
return false — they fully replace vanilla logic. If you experience unexpected visual issues with fires or smoke, disable the relevant module.
- Private game fields are accessed via
AccessTools.Field (cached) and Traverse — no direct decompiled references, compatible with future game updates.
v2.6.4
Added
- Nothing (maintenance release).
v2.6.3
Added
- Welcome screen on main menu launch.
- Displays a feedback message on first launch.
- Clickable link to Steam profile for bug reports and suggestions.
- "Don't show anymore" checkbox to permanently hide the screen.
v2.6.0
Changed / Fixed
- Removed
NetworkManager (ZSteamSocket-only implementation, broke crossplay).
- Removed
ZDOOptimizer (potential desync risk on servers).
- Fixed
LightLODManager: removed duplicate ScanForLights() call on Start.
- Fixed
AdvancedLightManager: removed periodic FindObjectsByType scan every 5 s (caused micro-freezes).
DistanceCuller refactored: all cullers now managed by one central Update loop instead of one Update() per object.
PiecePatches: replaced ConcurrentDictionary with Dictionary (main thread only, 3–5× faster lookup).
AsyncWearInit: added early exit when queue is empty.
v2.5.1