Steam Deck OLED Fest Demo Drains Battery on Idle Menu Despite Menu FPS Cap - How to Fix
Problem: You fixed Unity menu vSync vs targetFrameRate—the Steam FPS overlay shows ~60 on the title screen. On Steam Deck OLED, the fan still ramps, the case warms, and Wh/min stays high during a 15-minute idle menu session. Fest chat calls it “unoptimized” even though FPS looks capped.
Who is affected now: Teams shipping June–October 2026 fest builds after the menu FPS cap opinion, help #28, and the Deck OLED battery verification resource. FPS cap ≠ power cap—compat checklists do not replace idle battery smoke.
Fastest safe fix: Confirm FPS cap on installed Steam build → run 15-minute idle menu smoke on battery with MangoHud or Deck power UI → reduce render scale / full-screen UI redraw / menu VFX → suspend idle audio buses → set idle_power_smoke_pass: true on menu_fps_cap_receipt_v1.json → separate compat row from menu_idle_power on BUILD_RECEIPT.
Direct answer
A frame-rate cap limits how often the CPU/GPU present frames. Power draw still scales with resolution, shader cost per frame, UI canvas rebuilds, VRR refresh, and audio/system wakeups. Deck OLED panels often run 90–120 Hz; capping simulation to 60 FPS without lowering present cost or display policy leaves the device busy. Treat idle menu power as its own gate beside FPS proof.
Why this issue spikes in June 2026
- Menu FPS cluster shipped — Teams file
menu_fps_cap_receipt_v1.jsonwith overlay FPS only. - Deck battery resource brief #6 — Separates compat from idle Wh/min verification.
- OLED 120 Hz reviews — Streamers clip fan noise at title screen, not gameplay.
- Animated menu UI — Spine/UI Toolkit/URP post stack still renders expensive frames at 60 FPS.
- October fest traffic — Short sessions mean menu dwell time dominates first impressions.
Pair with 12 Free Deck battery verification tools. If overlay still shows 120 FPS, fix FPS first—Unity vSync override help.
Symptoms and search phrases
- Steam overlay 60 FPS but fan audible on static menu.
- Wh/min on idle menu ≥ gameplay baseline (wrong).
- Deck warm before player presses Start.
- MangoHud GPU% spikes on menu with no input.
- Animated background + capped FPS still drains battery.
- Works plugged in at desk; fails on battery fest play pattern.
- Compat / Verified pass but Reddit cites “kills battery at menu.”
Root causes (check in order)
- FPS capped but GPU cost per frame high — blur, bloom, full-screen video loop at 60 Hz.
- Render scale / internal resolution still at 100%+ on Deck.
- UI redraw every frame — legacy
OnGUI, unbatched Canvas, constant layout rebuild. - VRR / refresh not aligned — 120 Hz panel presenting 60 FPS simulation.
- Audio buses / music analyzer waking DSP on idle menu.
Application.runInBackgroundor networking tick on title scene.- Steam overlay / remote play polling during smoke—note in receipt, retest with overlay minimal.
Beginner path (first 30 minutes)
Prerequisites: Fest demo installed from Steam (not Editor), Deck on battery (~40%+ charge), menu FPS cap already passing.
- Enable Steam FPS overlay → confirm menu ≤ 62 FPS for 30 s.
- Install MangoHud (see battery resource list).
- Sit on main menu 15 minutes without input—note fan and Power in Steam Quick Access.
- Load gameplay level 1 5 minutes—compare subjective drain.
- If menu drain feels worse, continue to Step 2 (UI + render scale).
Common mistake: Testing only overlay FPS on a plugged-in dev PC—fest reviewers use Deck battery.
Fastest safe fix path
Step 1 — 15-minute idle menu power smoke (installed build)
| Minute | Action | Record |
|---|---|---|
| 0 | Launch from Steam library → main menu | build_label, branch |
| 0–1 | Confirm FPS cap | observed_menu_fps_max |
| 1–16 | No input; menu idle | Fan? heat? MangoHud avg GPU% |
| 16 | Screenshot Quick Access battery rate | Optional Wh/min note |
| 17–22 | Gameplay smoke (same session) | Baseline comparison |
Pass: Menu idle Wh/min (or qualitative “low/medium/high”) ≤ gameplay for your genre, and fan does not spike worse than gameplay within first 5 minutes.
Fail: Menu hotter or faster drain → Step 2–4.
Outbound: Steam Deck documentation, MangoHud.
Step 2 — Lower per-frame cost (Unity example)
Cap FPS first; then cut work per frame:
// Menu scene — reduce Deck internal resolution (Unity URP example)
void ApplyDeckMenuPowerProfile()
{
if (!Application.isMobilePlatform) { /* also gate on Steam Deck runtime API if you use it */ }
ScalableBufferManager.ResizeBuffers(0.85f, 0.85f); // example starting point
// Disable expensive menu post features on a MenuVolume
}
| Lever | Menu fest target |
|---|---|
| URP render scale | 0.85 or lower on Deck only |
| Menu post-processing | Off or static frame grab |
| Full-screen video background | Paused or 30 FPS decode |
| Particle systems | Stop on menu idle |
Godot: lower viewport scale + disable process_mode on decorative nodes. Construct/NW.js: reduce canvas size and pause WebGL effects when document hidden.
Step 3 — Cap UI refresh rate (not just game FPS)
| Engine | Pattern |
|---|---|
| Unity UI Toolkit | Avoid per-frame MarkDirtyRepaint; batch notifications |
| Unity uGUI | Disable Canvas on static elements; no Update layout spam |
| Godot Control | process_mode = PROCESS_MODE_DISABLED on static labels |
| Web/NW.js | requestAnimationFrame throttle for menu DOM |
Rule: If nothing changed on screen, do not rebuild layout this frame.
Step 4 — Audio and background discipline
// Unity — pause non-essential buses on menu (pseudo)
// AudioListener.pause = false; mute decorative buses only
- Menu music: loop at lower sample rate or static bed—not full combat mix.
- Disable networking, Steam stats tick, and achievement flush on title scene.
- Set
Application.runInBackground = falseunless you have a documented reason.
Step 5 — File menu_fps_cap_receipt_v1.json with power gate
{
"schema": "menu_fps_cap_receipt_v1",
"build_id": "fest-demo-2026-05-24",
"engine": "Unity 6",
"fest_public": {
"main_menu_max_fps": 60,
"target_frame_rate_menu": 60,
"vsync_menu": false,
"verified_on_battery": true,
"idle_power_smoke_pass": true
},
"proof": {
"steam_install": true,
"platform": "steam_deck_oled",
"menu_idle_seconds": 900,
"observed_menu_fps_max": 60,
"idle_power_smoke_minutes": 15,
"mangohud_menu_gpu_percent_avg": 28,
"gameplay_baseline_note": "menu_wh_per_min <= gameplay_wh_per_min",
"observer": "human"
},
"promotion_allowed": true
}
Block fest promotion if idle_power_smoke_pass is not true while observed_menu_fps_max looks fine.
Attach to Wednesday smoke with separate BUILD_RECEIPT columns:
| Column | Example |
|---|---|
menu_fps_cap |
pass |
menu_idle_power |
pass |
deck_compat |
pass (different test day OK) |
Working dev path (proof table)
| Check | Tool / artifact | Pass signal |
|---|---|---|
| FPS cap | Steam overlay | ≤ 62 menu idle |
| Power smoke | 15 min installed menu | idle_power_smoke_pass: true |
| GPU load | MangoHud | Menu avg GPU% ≤ gameplay or team threshold |
| Render scale | Frame Debugger / render doc | Deck menu ≤ 0.85 scale |
| UI churn | Profiler (one capture) | No layout rebuild spam |
| Receipt | menu_fps_cap_receipt_v1.json |
Both FPS + power rows |
| Complement | 18-deck compat resource | Proton/input pass separate day |
Verification checklist
- [ ] Menu FPS cap verified on Steam-installed build.
- [ ] 15-minute idle menu on battery completed.
- [ ]
idle_power_smoke_pass: truein receipt. - [ ] Gameplay baseline recorded same session or documented.
- [ ] BUILD_RECEIPT has
menu_idle_powercolumn distinct fromdeck_compat. - [ ] Animated menu assets audited (video, particles, blur).
- [ ] No
internaluncapped menu profile onfest_publicdepot.
Prevention
- Add power smoke to Wednesday ritual beside FPS gate.
- Bookmark Deck battery verification resource.
- Never treat 18-deck compat list as battery sign-off.
- Profile menu scene once per milestone—GPU time, not only FPS.
- Pair with menu FPS opinion in producer checklist.
Troubleshooting
| Symptom | Fix |
|---|---|
| 60 FPS but hot menu | Step 2–3: render scale + UI rebuild |
| Overlay 120 FPS | vSync / targetFrameRate help first |
| Only bad on battery | Expected—always smoke unplugged |
| MangoHud unavailable | Steam Quick Access battery trend + fan subjective; note in receipt |
| Gameplay worse than menu | Investigate gameplay GPU; menu gate still required |
| Cap broke after UI polish | Re-run 15-minute smoke after every menu art pass |
FAQ
Is 60 FPS enough for Deck fest demos?
Necessary, not sufficient—add idle power smoke for OLED trust.
Does Gamescope fix battery?
Can enforce frame cap when engine ignores API—see battery resource; still reduce per-frame cost.
Verified vs battery?
Verified is input/readability/launch; battery idle is separate Wh/min discipline.
Non-Unity engines?
Same gates: cap simulation FPS, cut menu GPU/UI cost, 15-minute installed smoke, receipt fields.
Streamers clip fan at menu?
File receipt + optional 30 s idle clip in release-evidence/—see menu FPS opinion evidence folder.
Related links
- 12 Free Steam Deck Battery and OLED Verification Tools (resource)
- Unity targetFrameRate Ignored by vSync on Menu (fix)
- 14 Free Unity Fest Demo Menu FPS vSync Tools (resource)
- Fest Demos Should Cap Menu Frame Rate (opinion)
- Wednesday Demo Build Smoke Ritual
- 18 Free Steam Deck Performance and Compatibility Resources
- Steam Deck documentation
Prove idle menu power on the Steam-installed Deck build—overlay FPS alone is not fest-ready.