ValheimPerformanceOverhaul
Comprehensive performance optimization mod. Reduces CPU/GPU load via light culling, LOD system, AI throttling, distance culling, piece sleep management and more. Designed for large bases and busy servers.
| Date uploaded | 2 days ago |
| Version | 2.6.4 |
| Download link | Skarif-ValheimPerformanceOverhaul-2.6.4.zip |
| Downloads | 493 |
| Dependency string | Skarif-ValheimPerformanceOverhaul-2.6.4 |
This mod requires the following mods to function
denikson-BepInExPack_Valheim
BepInEx pack for Valheim. Preconfigured and includes unstripped Unity DLLs.
Preferred version: 5.4.2202README
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.dllintoBepInEx/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.
π€ 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.
π¨ Graphics Settings
- Configurable shadow distance, resolution, and cascade count.
- Bloom and screen-space reflections toggle.
- Terrain quality multiplier.
πΏ 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
ItemDropGameObjects 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.
πΊοΈ Minimap Optimization
- Configurable texture resolution and update frequency.
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 |
| 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 |
| Shadow Distance | 50 m | Maximum shadow render distance |
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) | ~20β40% |
| Busy server with many players/mobs | ~15β30% |
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). - β οΈ Despite the fact that I conducted test runs in various situations, the mod is in BETA. Although the mod technically cannot break the world, it is advisable to make backups.
- β Does not support crossplay (Steam + Game Pass mixed sessions). Pure Steam servers are fine.
Changelog
v2.6.4
Added
- nothing
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
2.6.0
- Removed NetworkManager (ZSteamSocket-only, broke crossplay)
- Removed ZDOOptimizer (potential desync risk on servers)
- Fixed LightLODManager: removed duplicate ScanForLights() on Start
- Fixed AdvancedLightManager: removed periodic FindObjectsByType scan every 5s (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β5x faster)
- AsyncWearInit: added early exit when queue is empty
2.5.1
- Initial public release
CHANGELOG
Changelog
v2.7.1
Added
- mini-update (smokePatch).
v2.7.0
Added
-
Light Flicker Optimization β Harmony Prefix on
LightFlicker.CustomUpdatethat 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.CustomUpdatethat 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
QualitySettingsat startup:softParticles = false,softVegetation = false, configurableparticleRaycastBudget(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.maximumDeltaTimewhen 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) andTraverseβ 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 duplicateScanForLights()call onStart. - Fixed
AdvancedLightManager: removed periodicFindObjectsByTypescan every 5 s (caused micro-freezes). DistanceCullerrefactored: all cullers now managed by one centralUpdateloop instead of oneUpdate()per object.PiecePatches: replacedConcurrentDictionarywithDictionary(main thread only, 3β5Γ faster lookup).AsyncWearInit: added early exit when queue is empty.
v2.5.1
- Initial public release.