跳轉到

D-20260811-09|定點能量帳與全 SOC 線性供電

背景與驅動力

舊模型以 mAh 包裝遊戲尺度容量,K_DRAIN 又與自身校準說明相差 1000 倍,使一般駕駛耗電近乎 不存在。晶片的 1–100 整數分配值未除以 100,導致名為 energy/J 的量實際位於 100 倍直乘域; 電池輸出上限與晶片總配額也只在 authoring 層守門,可由手工 GLB 繞過。專案仍在開發期,公版 GLB 是半成品,因此直接破壞式升版,不保留錯誤單位、欄位或相容 fallback。

考慮過的選項

  • 只把 K_DRAIN 改成 0.001:保留 mAh 假單位與效果能量歧義,之後仍需再校準,棄。
  • 固定 20% knee/5% reserve:容易理解,但會把重輕車的失速點硬寫成同一 SOC,棄。
  • 全 SOC 線性可供功率、整數 mW/mJ 能量帳、效果/成本/熱分帳(採納)。

決定

  • PhysicsManifest v6:motor 使用整數 autoInputMw;battery 使用整數 configuredOutputMwenergyCapacityMj。runtime 以 1/60 mJ quantum 保存 remaining energy;60Hz 下供應 P mW 一幀恰扣 P quantum,不再有 mAh 或 K_DRAINK_DRAIN_FROM_J
  • availableOutputMw=floor(configuredOutputMw×remainingEnergyQ/initialEnergyQ),全 SOC 線性,無 knee、reserve 或固定停車線。drive 先取 min(autoInputMw,availableOutputMw);只要自走命令與 motor/battery 有效,達極速、失去牽引、卡牆或全胎 broken 仍耗實際供應功率。
  • chip 欄位改為 allocation_pctallocationPct,仍存 1–100 整數,計算時除以 100,不依總和 正規化;全槽總和不得超過 100,低於 100 是合法低配。駕駛先結帳,技能再依已簽 event 順序 結帳;剩餘能量不足按 granted/requested 等比縮放,禁止透支。
  • effect_energy_jbattery_cost_j 分帳。Event 效果固定取一秒功率積分,成本使用每技能 protocol-owned equivalent frames;Hold 效果與成本皆按幀。passive weapon 不耗能;launch 只在 projectile 成功 release 後按 fire interval 結算,冷卻、空彈或失敗一律為零。
  • chip/battery skill heat 分別由實際 battery_cost_j 乘 waste-heat fraction 進既有 J/W ledger; 效果能量、電池成本與兩路廢熱不得混為同一量。
  • battery configured_output_w 必須不超過實際幾何體積上限,chip allocation 總和不得超過 100; 兩條 hard rule 都在 canonical finalizer、首次 ledger admission 與 runtime typed manifest boundary fail-closed,並登錄 PART-R-001/PHYS-R-001 conformance contract。
  • open4wd_version、PhysicsManifest、builtin assets、SavedState 分別升到 6/6/6/9;27 個半成品 builtin 同版重烘。正式 runtime 與重開流程不讀舊欄,生成測試只保留一次性的半成品來源轉換。
  • HUD 顯示 SOC、目前可供輸出比例,且當 available output 低於 motor input 時顯示「輸出受限」; 實際失速仍由質量、坡度、接觸、滾阻、輪胎、氣動與損壞自然決定。

後果與影響

能量帳現在可用量綱與整數不變式直接稽核,低 SOC 性能連續下降,重車與輕車可在不同 SOC 自然 失去有效推進。禁晶片賽因移除主要額外負載而降低電池差異是規則自然結果,不另設模式倍率。 代價是所有資產、snapshot、指紋、editor、catalog、runtime 與規格必須同批升版;開發期無正式鏈 與已發布資產,故不承擔相容層與二次校準成本。