Skip to content

Snapshot zh TW

bbfox0703 edited this page Jul 10, 2026 · 1 revision

🌐 English · 繁體中文 · 日本語

Snapshot

實驗性分頁(預設關閉)。

Snapshot 分頁會把每個(範圍內)物件的每一個數值型 UPROPERTY 擷取到一個持久化的磁碟 snapshot 中。之後你可以diff 兩個 snapshot 來看哪些改變了,或在一個 snapshot 上對數個值做group-match——經典的「哪個物件同時持有所有這些數字?」搜尋,只不過是在一份已擷取的語料上、而非即時記憶體。Snapshot 也會餵給 SPC QueryClass Pivot 分頁。

由於 snapshot 是一次完整的數值傾印,在大型遊戲上它可能會很大——下方的擷取控制項就是用來把它控制在合理範圍內。


擷取一個 snapshot

Capture snapshot 面板(可折疊)有一排設定:

控制項 功用
Scope 要納入哪些數值欄位寬度
Type 在 Scope 之上的家族窄化:All numericIntegers 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

管理已儲存的 snapshot

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

分析:Diff vs. Group

一個 Mode 切換讓下半部在 DiffGroup (Multiple Values) 之間切換。

Diff 模式——兩個 snapshot 之間有什麼改變

挑一個 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。

Group 模式——持有數個值的物件

在一個 snapshot 上找出在不同數值位移持有全部 2–4 個值的物件——Value Search Group Scan 的 snapshot 等價版。

  • 挑要搜尋的 Snapshot,然後 FindClear 重設)。
  • + 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 並使用相對謂詞。

Noise picker(擷取後,僅 Diff 模式)

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 / 🌍 / 的落腳處。

Clone this wiki locally