Research 10 / Adaptive timing

讓過載變成穩定節奏,不讓遊戲世界變慢。

偶發漏畫與持續超載是兩種不同問題。Drop-frame 保護單一 LCD frame 的提交期限;Adaptive presentation dispatch 則在量測到長期壓力後,主動降低完整場景的建構頻率,同時維持遊戲邏輯、音訊與關卡流程的原始節奏。

≈34.8 Hzsource logic / Normal
≥17.4 FPSAdaptive presentation floor
0audio frames intentionally skipped

兩套互補、不能混為一談的機制

Dynamic Drop-frame 是逐 LCD frame 的 deadline scheduler。若估算新場景無法在安全期限前完成,就保留上一張已完整提交的 OAM、VRAM 與背景狀態,避免把半套畫面交給顯示硬體。

Adaptive presentation dispatch 是建立在 Drop-frame 上的壓力狀態機。它觀察連續 deadline 壓力與真正的 missed VBlank;確認不是一次冷快取尖峰後,才把完整場景建構鎖到較低且規律的 cadence,避免不穩定地連續超時。

這裡降低的是 presentation FPS,不是內部遊戲邏輯 FPS。兩者若被混稱為「降內部 FPS」,很容易誤以為敵人、碰撞或音樂也被放慢。

哪些工作永遠不能被省略

Adaptive 只捨棄已被較新狀態取代、尚未送出的中間畫面。下列 authoritative state 仍按原順序執行:

  • 玩家輸入、移動、武器 cooldown 與能量;
  • 敵人事件、Boss 流程、碰撞、傷害與掉落;
  • 關卡位置、script 分支與 RNG 呼叫順序;
  • 每個實體 VBlank 的 Maxmod 音樂與音效服務。

因此畫面在壓力下可能維持上一個完整 frame,但下一張出現時會直接反映正確時間點,不會因少畫一張而讓關卡慢動作或改變戰鬥結果。

三段壓力狀態與 17.4 FPS 下限

Light預設;安全預算足夠就呈現
Medium每兩個 source tick 一張
Severe同為兩 tick;只保留高壓分類

Tyrian 的 Normal speed 約為 34.8 logic tick/s。正式設定將一張刻意輸出的場景限制為最多代表兩個 source ticks,因此 Medium/Severe 的目標下限約為 17.4 FPS。早期 Severe 曾允許三 tick、約 11.6 FPS;實機觀感過於不連續,現行程式已從型別與編譯檢查上禁止回到該設定。

只對持續壓力反應,不因單一尖峰抖動

一般 gameplay 必須累積至少 4 點 deadline 壓力及 2 次 missed VBlank 才進入 Adaptive;壓力達 8 或 missed VBlank 達 4 時標記為 Severe。lava/water 場景因波紋還占用顯示時序,在確認 2 點壓力及 1 次 missed VBlank 後可提早進入 Severe,但仍受相同 17.4 FPS 下限約束。

  • 連續 16 張完整 render 都低於 150,000 cycles 才退出,避免 cadence 來回跳動;
  • 最多保留兩個 pending logic ticks,超過就強制產生新場景;
  • 背景 ring row、關卡狀態轉換及 freshness 條件永遠可以強制 render;
  • 一般 Boss、爆炸與複雜武器使用同一套全域量測,不靠 per-level 特例。

歷史 A/B:一般非 wave 關卡也能受益

Episode 2 Section 1 的 600-VBlank 壓力測試,在遊戲邏輯更新、RNG、玩家子彈數與音訊結果完全相同時,加入 Adaptive 後 missed VBlank 由 165 降至 93,減少 43.64%;平均 loop work 由 224,781.42 降至 186,695.33 cycles,減少 16.94%,兩版 audio frame loss 都是 0。

165 → 93missed VBlank
-16.94%average loop work
0 / 0audio frame loss
這組數據來自能降至三 tick 的歷史基準,用來證明 Adaptive 不只對 lava/water 特例有效。現行 v89 Release 已將流暢度優先權提高,Medium 與 Severe 都封頂為兩 tick,因此不應把歷史 complete-render 數量直接當成目前版本預期值。

安全網不是免除最佳化的魔法

GBA 每個 LCD frame 約有 280,896 CPU cycles。若單一不可切割的 render、解碼或 cache miss 本身已超過這個預算,Drop-frame 與 Adaptive 只能避免它再和其他昂貴 phase 疊在一起,不能縮短該工作本身。這類瓶頸仍要以 build-time 預處理、DMA、cache、IWRAM/ARM leaf kernel 或演算法改善解決。

正式版因此同時開啟 Dynamic Drop-frame、全域 Adaptive presentation dispatch 與 wave 快速進入策略。關閉 Adaptive 只用於受控 A/B;它不是一般 Release 選項,也不套用到靜態前端選單。

最終原則

過載時可以少交付一張已過時的畫面,但不能少算一次會改變遊戲結果的工作。把 authoritative simulation 與可被取代的 presentation 分開,才讓 GBA 在極端火力下維持音樂與正確流程,同時把視覺退化限制為穩定、可量測且有最低下限的呈現頻率。