跳轉到

D-20261101-01|本機測試也顯示效能警告並附顯示設定入口

背景與驅動力

issue 001174:公版 urban/jungle 場地的單車本機測試,物理每步成本(Node 無頭 27.5/21.0 ms、使用者 Chrome 模擬 Worker 33.6 步/秒)已高於 60 Hz 的一個 tick,模擬以 0.63 倍速推進、固定步迴圈補步成簇,玩家看到的是慢動作 加停格再跳。D-20261028-04 第 4 項只在正式比賽回合取樣每幀實付並顯示效能 警告,local-test 明文不產生警告;玩家在本機測試裡完全不知道是裝置跟不上,也不知道設定頁已有 3D 算圖解析度與 反鋸齒可調。一般玩家(中階筆電、手機、平板)不會自行查 GPU 或 CPU 負載,呈現層至少要說清楚「裝置跟不上」並給出口。

同一輪量測也確認插值層的固定落後一步在到達間隔 20~50 ms 擺盪時會讓顯示時刻追平最新幀;該修正屬純呈現細節, 寫在 程式架構/physics-engine.md 的視覺插值段,不另立決策。

考慮過的選項

  • 維持 local-test 不警告:玩家只能靠體感猜測,與「本機測試用來驗證裝置與車」的目的相違(否決)。
  • 在本機測試裝一套獨立門檻:與 D-20261028-04 的三層口徑分叉、兩處判定(否決)。
  • local-test 以同一個 FrameCostMonitor、同一口徑取樣並警告,橫幅加顯示設定入口(採納)。
  • 自動依 GPU 幀時間降算圖倍率:屬 issue 001173 的獨立設計,不併入本決策。

決定

1. local-test 也取樣每幀實付

  • 模擬端在 match 與 local-test 回合都建立 FrameCostMonitor;判定規則不變(滾動 600 幀 P95 超過一個 tick、每 60 幀重算、每回合重新取樣)。
  • local-test 的每幀實付=engine.step 加該幀實際發生的 stateHash 與 saveState(對齊幀),不含簿記與 captureStepExtras,口徑同 match 的 RollbackEngine。
  • 觀戰 replay 走另一個 core,維持不取樣、不警告。

2. 橫幅附顯示設定入口

  • 比賽頁的效能警告橫幅維持純提示(role=status、不阻擋輸入),文字後附一個連到顯示設定(/settings/display)的入口,讓玩家直接去降 3D 算圖解析度或關反鋸齒。
  • 四語系文案同步。

後果與影響

  • 玩家在本機測試就能知道裝置是否跟不上,並有明確出口;這不改變物理層每步成本過高的根因(issue 001174 批 B、001074),只是把問題說清楚。
  • 本機測試多了每幀兩次讀時鐘的成本(µs 級),不進共識。
  • 現況規格:程式架構/network-sync.md 第 8 節效能警告段、賽內機制.md 效能警告條。
  • 與既有決策的關係:amends D-20261028-04 第 4 項的「local-test 不產生警告」,其餘口徑不變。

定案紀錄

2026-11-01 使用者裁決先做呈現層:local-test 也以同口徑取樣並顯示效能警告、橫幅附顯示設定入口、插值落後改自適應;物理層 CCD 成本另案待決。