- 計算一組可在 Metrics 檢視中繪製圖表的記憶體相關計數器。
- 在 Range Details 檢視中建立配置堆疊樹狀結構。
- 在 Timeline 檢視中顯示遊戲已使用記憶體的圖表。
- 依資料類型顯示所有記憶體配置的清單。
- 建構所有已配置與已存取記憶體的對應圖。記憶體對應圖以及相關的資料篩選器與分析功能會顯示在 Memory 版面配置中。
- 檢查 Metrics 檢視中的計數器,找出發生非預期情況的時段,然後使用 Metrics 檢視的操作功能表前往 Timeline 檢視中的該時段,以檢視配置堆疊樹狀結構。
- 選取 Title Memory Used 通道中的點,並將這些時間點的遊戲記憶體細分與擷取開始時的細分進行比較,以了解遊戲記憶體的使用量如何隨時間變化。
- 檢查各種資料結構中的填補量,尋找移除不必要填補的機會,從而縮減類型的大小。
- 使用 Memory 版面配置找出已配置但從未存取的記憶體。找出這類配置有助於減少整體記憶體使用量。
收集記憶體配置與分頁錯誤資料
時間擷取選項窗格包含多個核取方塊,可用來選擇是否收集VirtualAlloc、HeapAlloc、XMemAlloc 以及遊戲中定義之任何自訂配置器呼叫的記憶體資料 (圖 1)。也可以收集分頁錯誤事件。
圖 1. 收集記憶體配置資料的選項。

VirtualAlloc 呼叫的資料,也會收集核心集區使用量的資料。若要在 Timeline 檢視中看到 Title Memory Used 通道,必須選取 VirtualAlloc 核取方塊。
若要收集記憶體配置資料,請選取要追蹤的配置器,然後開始擷取。
收集記憶體存取樣本
PIX 會根據樣本識別記憶體存取。每次收集 CPU 樣本時,PIX 也會記錄系統暫存器的值。這些暫存器值,連同遊戲的 PDB 與可執行檔,會用來找出導致記憶體存取的 CPU 指令。由於存取是使用取樣識別,因此與取樣率較低的較短擷取相比,取樣率較高的較長擷取能更完整地呈現遊戲的記憶體存取模式。收集記憶體存取樣本之前,請將遊戲 PDB 與可執行檔的路徑都新增至符號路徑設定。

Metrics 檢視中的記憶體計數器
啟用一或多個記憶體收集選項時,PIX 會收集並計算數個記憶體相關計數器,並將其新增至 Metrics 檢視。共計算三組計數器。- Event Rate
- Memory Usage
- Unfreed allocations


VirtualAlloc 進行之配置的穩定階梯式成長模式。
圖 4. 繪製記憶體使用量計數器的圖表。



VirtualAlloc 的未釋放大小不為零。展開配置堆疊樹狀結構,即可找出造成未釋放記憶體的呼叫堆疊。
除了 Event Rate、Memory Usage 與 Unfreed Allocations 計數器之外,Metrics 檢視也包含 System Monitor 中提供的所有記憶體相關計數器。您可以在 Selector 面板的 Title Memory 區段中找到這些計數器 (圖 7)。
圖 7. Metrics 檢視中的 System Monitor 記憶體計數器。

在 Range Details 檢視中分析記憶體配置
收集記憶體資料時,PIX 會記錄每次記憶體配置與釋放的呼叫堆疊。接著 PIX 會將呼叫堆疊彙總成整體配置樹狀結構。若要檢視樹狀結構,請在 Timeline 檢視中選取時間範圍。在 Items to Show 下拉式功能表中,選取 Allocation Stack Tree (圖 8)。Range Details 中顯示的配置樹狀結構包含所選時間範圍內發生的所有配置。 圖 8. Range Details 檢視中的 Allocation Stack Tree 選項。
VirtualAlloc、Kernel Pool、HeapAlloc、XMemAlloc 與 Title Allocators。例如,這種分組會讓使用 HeapAlloc 進行的配置與釋放,與使用 XMemAlloc 進行的配置與釋放分開。使用檢視左側的 Selector 面板,指定樹狀結構中應顯示哪些配置器。
樹狀結構中的第二層分組,有助於根據每種配置器類型的準則進一步將記憶體分類。
VirtualAlloc配置會依遊戲與工具分組,以指出進行配置的分割區。- Kernel Pool 配置會依集區標籤分組。這些標籤定義在 pooltag.txt 檔案中,此檔案會隨 Windows 10 SDK 的偵錯元件一起安裝。安裝 SDK 後,您可以在開發電腦上的 C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage 中找到 pooltag.txt。
HeapAlloc配置會依堆積控制代碼分組,讓您可以逐一分析每個堆積的記憶體使用量。XMemAlloc配置會依記憶體類型分組。- Title Allocators 會依 Allocator ID 分組,其中 ID 是傳遞給 PIXRecordMemoryAllocationEvent 之
allocatorID參數的值。

LeakMemorySometimes 進行了 316 次記憶體配置,且這些配置中有 3,481,272,320 個位元組在擷取結束時尚未釋放。
圖 10. 展開配置堆疊樹狀結構的一部分。

LeakMemorySometimes 是在兩個不同的呼叫堆疊中被呼叫。第一個呼叫堆疊經過 Process 函式,第二個呼叫堆疊經過 UpdateEnemyPositions。這兩個函式的 Unfreed Size 欄指出,所有未釋放的記憶體都來自第一個呼叫堆疊,也就是包含 Process 的那一個。
在 Range Details 檢視中選取函式,會在 Element Details 檢視中填入該函式所配置與釋放之記憶體的其他資訊。Source Analysis 索引標籤會顯示原始程式碼清單,指出函式中有哪些行配置了記憶體 (圖 11)。
圖 11. 所選函式的 Element Details 檢視。




VirtualAlloc 進行之所有配置的平面清單。在 Items to Show 下拉式功能表中,選取 Virtual Memory Allocations 以檢視配置清單 (圖 15)。根據預設,清單會依時間排序,並包含 Size、Unfreed Size 與 Flags 等欄。
圖 15. 檢視虛擬記憶體配置。

在時間軸中檢視分頁錯誤
分頁錯誤事件會在 Timeline 的執行緒與核心通道中繪製為黃色垂直線。 選取分頁錯誤事件,會在 Element Details 檢視中填入該事件的其他資訊,包括分頁錯誤的類型以及導致事件發生的呼叫堆疊 (圖 16)。
使用 Title Memory Used 圖表檢視記憶體使用量報告
如果您在開始擷取之前選取了收集VirtualAlloc 呼叫資料的選項,PIX 會建立名為 Title Memory Used 的通道,其中包含擷取期間各個取樣點使用中之遊戲記憶體量的圖表。首次建立時,Title Memory Used 通道可能會出現在擷取的底部。您可以使用通道設定面板釘選該通道或將其往上拖曳。
Title Memory Used 通道的 Y 軸範圍從零到主機上可用的遊戲記憶體量。將滑鼠指標停留在通道中的任何點上,即可顯示該點使用中的遊戲記憶體量。圖 17 顯示 Title Memory Used 通道,其中的工具提示顯示在擷取約 1 分鐘時,有 4.3 GB 的遊戲記憶體正在使用中。在此案例中,遊戲記憶體使用量持續成長,直到接近擷取結束時在最大值趨於平穩。
圖 17. Timeline 檢視中的 Title Memory Used 通道。

- **
VirtualAlloc已認可記憶體:**此總計不包含擷取開始之前透過呼叫VirtualAlloc配置的記憶體。 - **映像使用量:**此類別代表用來儲存遊戲二進位映像的記憶體。
- **實體分頁配置:**此總計包含擷取開始之前進行的配置。
- **其他:**其他類別包含用來儲存分頁表項目、記憶體描述元清單與其他小型配置所用記憶體的遊戲記憶體。此總計包含擷取開始之前進行的配置。
在未來版本中,Memory Usage Comparison 表格將會擴充,以提供其他類別更詳細的細分。



依資料類型分析記憶體配置
除了記錄哪些函式與呼叫堆疊配置了記憶體之外,PIX 也會記錄所配置之資料類型的相關資訊。從 Range Details 檢視的 Items to show 下拉式清單中選取 Type Allocations,即可檢視已配置類型的清單。配置清單會依配置器分割,因此透過呼叫 VirtualAlloc 配置的類型,會與透過 HeapAlloc 或遊戲所用之任何自訂配置器配置的類型分開。 每種資料類型的配置清單可用來查看每種資料類型的配置次數與配置的記憶體量。此外,資料類型清單會顯示每種類型中的填補量,以及填補所佔用的整體記憶體量。了解填補量可用來尋找消除不必要填補的機會,從而縮減資料類型的大小並減少使用的記憶體量。 Range Details 檢視會為每種資料類型提供下列欄:- Allocation Count。類型被配置的次數。
- Size。類型本身的大小。
- Total Size。該類型所有配置佔用的記憶體總量。此數量為 Size 乘以 Allocation Count。
- Exc. Padding。類型本身的填補量。
- Total Exc. Padding。該類型所有配置中填補佔用的記憶體總量。此數量為 Exc. Padding 乘以 Allocation Count。
- Name。類型的名稱。
- Inc. Padding。類型本身的填補量,加上所有巢狀類型中的填補。
- Total Inc. Padding。該類型所有配置中填補佔用的記憶體總量,加上巢狀類型的配置。此數量為 Inc. Padding 乘以 Allocation Count。


使用 Memory 版面配置分析記憶體存取
Memory 版面配置可用來分析在開始時間擷取之前選取 Sample Memory Accesses 核取方塊時所收集的記憶體配置、讀取與寫入。Memory 版面配置的主要使用者介面元素如下圖所示,並在後續項目中說明。
- **Memory Usage 圖表。**顯示擷取期間使用中之 CPU 遊戲記憶體與 D3D API 物件記憶體量的圖表。
- **開始分析的控制項。**一組用於開始記憶體分析的使用者介面控制項。
- **進度指示器。**回報記憶體分析階段的進度列。
- **記憶體對應圖。**所選時間範圍內進行之所有記憶體配置的對應圖。
- **分析篩選器。**用於根據一組預先定義準則篩選記憶體對應圖的使用者介面控制項。
- **用來開始動畫的控制項。**用於開始檢視個別記憶體存取所需之動畫的控制項。
- **分析面板。**分析面板提供兩個索引標籤:Summary Analysis 與 Allocation Details。Summary Analysis 索引標籤提供樞紐分析表,可根據一組預先定義的準則分析資料。下圖顯示先依 Allocation Thread 再依 Designation 樞紐分析的資料摘要。


執行記憶體分析
初次開啟擷取時,記憶體對應圖不會填入資料。若要填入對應圖,請在 Memory Usage 圖表中選取一段時間區域,從 Memory Type 下拉式清單中選取記憶體類型,然後按一下 Analyze 按鈕。


分析記憶體存取樣本
對所選時間區域執行記憶體動畫,即可取得每次記憶體存取的詳細資訊,包括存取發生時間點的時間軸連結及其呼叫堆疊。使用 Memory Animation 按鈕執行動畫。執行動畫時,PIX 會依時間順序處理每次記憶體存取,並在對應圖中反白顯示存取。記憶體讀取以一種色彩反白顯示,記憶體寫入則以另一種色彩反白顯示。下圖顯示動畫執行時的記憶體對應圖。

Summary Analysis 樞紐分析表
Summary Analysis 索引標籤包含一個樞紐分析表,可用來分析所選時間區域內配置的記憶體總量。配置的記憶體量可依各種準則進行樞紐分析,包括 XMem 標籤、配置執行緒,以及呼叫堆疊與 PIX 事件樹狀結構。在下圖中,配置的記憶體總量先依執行緒,再依配置記憶體的呼叫堆疊進行樞紐分析。

