-
Notifications
You must be signed in to change notification settings - Fork 6
Snapshot zh TW
⚗ 實驗性分頁(預設關閉)。
Snapshot 分頁會把每個(範圍內)物件的每一個數值型 UPROPERTY 擷取到一個持久化的磁碟 snapshot 中。之後你可以diff 兩個 snapshot 來看哪些改變了,或在一個 snapshot 上對數個值做group-match——經典的「哪個物件同時持有所有這些數字?」搜尋,只不過是在一份已擷取的語料上、而非即時記憶體。Snapshot 也會餵給 SPC Query 與 Class Pivot 分頁。
由於 snapshot 是一次完整的數值傾印,在大型遊戲上它可能會很大——下方的擷取控制項就是用來把它控制在合理範圍內。
Capture snapshot 面板(可折疊)有一排設定:
| 控制項 | 功用 |
|---|---|
| Scope | 要納入哪些數值欄位寬度。 |
| Type | 在 Scope 之上的家族窄化:All numeric、Integers only(Int8/16/32/64 ±,捨棄浮點)、或 Floats only(Float/Double,捨棄整數)。刻意是有損的——重新擷取才能把另一個家族帶回來。浮點 ≈ HP/MP/座標;整數 ≈ 計數/旗標/ID。 |
| Game objects only | 跳過非遊戲(引擎/transient)物件。 |
| Auto detect Engine/System noise |
預設開啟。 在來源端跳過純引擎/系統類別(UI widget、texture、sound、particle/Niagara、anim instance、/Script 引擎套件),因此擷取更快、DB 更小。一個遊戲玩法護欄會強制保留任何 Actor / Pawn / Character / ActorComponent / Controller / PlayerState 類別——所以玩家 Pawn 的 X/Y/Z 與 HP/MP(位於元件或 GAS AttributeSet 中)絕不會被捨棄。來源端跳過是不可逆的(關掉它並重新擷取才能把類別帶回來)。與擷取後的 Noise picker 不同。 |
| Native-C (raw) |
選用,預設關閉。 除了反射的 UPROPERTY 欄位外,也把每個物件的未受管洞(unmanaged holes)(非 UPROPERTY 的原始位元組)擷取為合成的 <raw@0xNN> 欄位,透過 Guess-What 啟發式解讀並正規化為數值型別。讓 SPC Query / Class Pivot 能追蹤反射看不到的原生值(HP/MP)。較慢且較大;raw 欄位以位移在 snapshot 之間 join。 |
| Per-game quota | 當一次擷取超過配額時,這個遊戲最舊的 snapshot 會被自動丟棄(在擷取完成之後)。 |
| Max size |
選用的擷取內上限。 當即時 DB 超過此值時,擷取會提前停止並保留部分 snapshot(已掃描的前 N 個物件)。與配額不同——配額只在擷取之後逐出整個較舊的 snapshot——這個會限制單一一次過大的擷取。在大型遊戲上請搭配 Estimate size 使用。Off 會停用它。 |
| Label | 選用名稱(預設為時間戳)。 |
兩個按鈕完成工作:
-
Estimate size——飛行前檢查:它以目前選項走訪一小份物件樣本,建模磁碟成本,並外推到完整物件數,而不寫入 DB。在你投入一次數 GB 的擷取前給你一個
~X GB的可行性判斷。 - Capture Snapshot——執行擷取。擷取(或估算)進行中時會出現 Cancel。
Saved snapshots 清單顯示這個遊戲的每次擷取,欄位為 Label · Captured (UTC) · Objects · Fields · Est. Size · Scope · UE。一條 Used: 條顯示配額已用多少。操作:
- Refresh——重新載入清單。
- Delete Selected / Delete All——移除 snapshot(Delete All 會 truncate + VACUUM 該 DB 以回收磁碟;不可逆)。
-
Open DB folder——在檔案瀏覽器中顯示這個遊戲的
snapshots.<pe_hash>.db。
一個 Mode 切換讓下半部在 Diff 與 Group (Multiple Values) 之間切換。
挑一個 Old 與一個 New snapshot 並 Run Diff,列出每個值有改變的欄位。這個 diff 一律是 deep 的——它包含巢狀陣列/struct-array 元素的變化(例如 SupportActionGauge[3],顯示為 Array[N]);這裡不需要 Deep 開關。
Diff 以工作階段內的物件身分(同一次遊戲啟動)join 欄位,因此 Old 與 New 應該來自同一個遊玩工作階段。
用 Class / Field / Object / Change(方向)篩選器、一個 Filter all 框(符合任何欄位),以及一個 Old / New 數值範圍(Apply range / Reset)來縮小結果。結果欄位:Δ · Class · Object · Field · Old · New。每一列提供 Live(在 Live Walker 中開啟)、🌍(Locate in GWorld)、⚙(Locate in GameEngine)與 Addr(複製)。Locate 僅作用於工作階段內的 diff。
在一個 snapshot 上找出在不同數值位移持有全部 2–4 個值的物件——Value Search Group Scan 的 snapshot 等價版。
- 挑要搜尋的 Snapshot,然後 Find(Clear 重設)。
- + value / − value——新增或移除值列(2 到 4)。每一列有一個寬度 scope、一個謂詞(predicate),以及一個值(外加 Between 謂詞的上界 to)。
- Compare with (Mode B)——挑一個較舊的 snapshot 來比對。這會啟用相對謂詞 Changed / Unchanged / Increased / Decreased——例如找出一個 Current HP 下降、而 Max HP 保持不變的物件。留空則為絕對的單一 snapshot 比對。(✕ 清除它。)
-
Deep (nested containers)——也比對巢狀容器/struct-array 元素內的值(例如
SaveSlotList[1]…Tunes[2]),折疊進擁有物件的區塊。關閉 = 僅直接欄位(較快、雜訊較少)。 - Rounding——分數的 float/double 目標在比對前如何被縮減。
結果是主從式(master-detail):每個相符物件一列(Class · Object · Matched values);展開一列可看每個 slot 的細節。物件列提供 Live(在 Live Walker 中開啟);Addr · 🌍 · ⚙ 則位於展開後的每個 slot 明細列上。
Group 常常需要 Unchanged。 經典的「current HP 下降、max HP 沒變」模式,只有在一個 slot 是 Decreased 且另一個是 Unchanged 時才能孤立出正確的物件——所以請挑一個 Compare with snapshot 並使用相對謂詞。
Diff 結果下方是一個 Noise picker(與 SPC Query 分頁相同的形式),僅在 Diff 模式顯示(Group 模式啟用時會隱藏):它在擷取之後篩選已完成的 snapshot(對比於在來源端跳過的 Auto detect Engine/System noise)。Apply 把選取的類別推入 denylist。
- SPC Query——跨多個 snapshot 查詢值(Diff 的多 snapshot 後繼版)。
- Class Pivot——把一個類別的欄位跨 snapshot 樞紐分析以找出它的數值佈局。
- Value Search——Group 模式的即時記憶體等價版。
- Detect Stats——用 snapshot 的「數值下降」訊號來為數值候選項評分。
- Live Walker——Live / 🌍 / ⚙ 的落腳處。