跳轉到主要內容
PIX 時間擷取包含多個選項,可記錄擷取執行期間所發生之記憶體配置、存取與釋放的相關資訊。此記憶體資料可用來:
  • 計算一組可在 Metrics 檢視中繪製圖表的記憶體相關計數器。
  • 在 Range Details 檢視中建立配置堆疊樹狀結構。
  • 在 Timeline 檢視中顯示遊戲已使用記憶體的圖表。
  • 依資料類型顯示所有記憶體配置的清單。
  • 建構所有已配置與已存取記憶體的對應圖。記憶體對應圖以及相關的資料篩選器與分析功能會顯示在 Memory 版面配置中。
結合記憶體計數器、配置樹狀結構、Title Memory Used 通道、記憶體存取以及類型配置清單,可以協助您分析遊戲的記憶體使用量並找出記憶體流失。典型的使用模式包括:
  • 檢查 Metrics 檢視中的計數器,找出發生非預期情況的時段,然後使用 Metrics 檢視的操作功能表前往 Timeline 檢視中的該時段,以檢視配置堆疊樹狀結構。
  • 選取 Title Memory Used 通道中的點,並將這些時間點的遊戲記憶體細分與擷取開始時的細分進行比較,以了解遊戲記憶體的使用量如何隨時間變化。
  • 檢查各種資料結構中的填補量,尋找移除不必要填補的機會,從而縮減類型的大小。
  • 使用 Memory 版面配置找出已配置但從未存取的記憶體。找出這類配置有助於減少整體記憶體使用量。
時間擷取也包含收集分頁錯誤事件的選項。例如,這些事件可協助您查看記憶體對應的某部分何時已分頁到磁碟。

收集記憶體配置與分頁錯誤資料

時間擷取選項窗格包含多個核取方塊,可用來選擇是否收集 VirtualAlloc、HeapAlloc、XMemAlloc 以及遊戲中定義之任何自訂配置器呼叫的記憶體資料 (圖 1)。也可以收集分頁錯誤事件。 圖 1. 收集記憶體配置資料的選項。 顯示在時間擷取中收集記憶體配置資料之選項的螢幕擷取畫面 收集 VirtualAlloc 呼叫的資料,也會收集核心集區使用量的資料。若要在 Timeline 檢視中看到 Title Memory Used 通道,必須選取 VirtualAlloc 核取方塊。 若要收集記憶體配置資料,請選取要追蹤的配置器,然後開始擷取。

收集記憶體存取樣本

PIX 會根據樣本識別記憶體存取。每次收集 CPU 樣本時,PIX 也會記錄系統暫存器的值。這些暫存器值,連同遊戲的 PDB 與可執行檔,會用來找出導致記憶體存取的 CPU 指令。由於存取是使用取樣識別,因此與取樣率較低的較短擷取相比,取樣率較高的較長擷取能更完整地呈現遊戲的記憶體存取模式。
收集記憶體存取樣本之前,請將遊戲 PDB 與可執行檔的路徑都新增至符號路徑設定。
選擇取樣率,然後在開始擷取之前選取 Sample Memory Accesses 核取方塊。使用 Memory 版面配置分析樣本。 顯示在時間擷取中收集記憶體存取樣本之選項的螢幕擷取畫面

Metrics 檢視中的記憶體計數器

啟用一或多個記憶體收集選項時,PIX 會收集並計算數個記憶體相關計數器,並將其新增至 Metrics 檢視。共計算三組計數器。
  • Event Rate
  • Memory Usage
  • Unfreed allocations
在每一組中,每個配置器都有自己的計數器。您可以在 Metrics 檢視 Selector 面板的 CPU Memory 區段中找到這些計數器 (圖 2)。 圖 2. 計算出的 CPU 記憶體計數器。 顯示 Selector 面板中計算出之 CPU 記憶體計數器的螢幕擷取畫面 Event Rate 計數器顯示每個配置器在擷取期間的記憶體配置速率。例如,圖 3 顯示 CustomAlloc 100 配置器集中進行記憶體配置的四個時段。 圖 3. 繪製事件速率計數器的圖表。 顯示 Metrics 檢視中事件速率計數器 CustomAlloc 100 活動的螢幕擷取畫面 Memory Usage 計數器顯示每個配置器在擷取期間使用的記憶體量。例如,圖 4 顯示使用 VirtualAlloc 進行之配置的穩定階梯式成長模式。 圖 4. 繪製記憶體使用量計數器的圖表。 顯示 Metrics 檢視中記憶體使用量計數器 VirtualAlloc 值隨時間變化的螢幕擷取畫面 Unfreed Allocations 計數器顯示擷取中未釋放配置的數目,並依每個配置發生的時間顯示。例如,圖 5 顯示數個時段,在這些時段中進行了配置,但在擷取結束前並未釋放。 圖 5. 繪製未釋放配置計數器的圖表。 顯示 Metrics 檢視中未釋放配置隨時間變化的螢幕擷取畫面 使用 Metrics 檢視識別從記憶體角度來看可能值得關注的時段之後,請使用操作功能表前往 Timeline 檢視中的該時段。在圖 6 中,在 Metrics 檢視中選取了發生未釋放配置的時段,然後與 Timeline 檢視同步。 圖 6. 在 Metrics 與 Timeline 檢視中檢視相同時段以協助記憶體分析。 顯示 Metrics 檢視與 Timeline 檢視中相同時段以進行記憶體分析整合的重疊螢幕擷取畫面 使用 Timeline 檢視時,您可以在 Range Details 檢視中看到配置樹狀結構。在圖 6 中,Range Details 如預期顯示 VirtualAlloc 的未釋放大小不為零。展開配置堆疊樹狀結構,即可找出造成未釋放記憶體的呼叫堆疊。 除了 Event Rate、Memory Usage 與 Unfreed Allocations 計數器之外,Metrics 檢視也包含 System Monitor 中提供的所有記憶體相關計數器。您可以在 Selector 面板的 Title Memory 區段中找到這些計數器 (圖 7)。 圖 7. Metrics 檢視中的 System Monitor 記憶體計數器。 顯示 Metrics 檢視 Selector 面板中 System Monitor 記憶體計數器的螢幕擷取畫面

在 Range Details 檢視中分析記憶體配置

收集記憶體資料時,PIX 會記錄每次記憶體配置與釋放的呼叫堆疊。接著 PIX 會將呼叫堆疊彙總成整體配置樹狀結構。若要檢視樹狀結構,請在 Timeline 檢視中選取時間範圍。在 Items to Show 下拉式功能表中,選取 Allocation Stack Tree (圖 8)。Range Details 中顯示的配置樹狀結構包含所選時間範圍內發生的所有配置。 圖 8. Range Details 檢視中的 Allocation Stack Tree 選項。 顯示 Range Details 檢視 Items to Show 下拉式功能表中 Allocation Stack Tree 選項位置的螢幕擷取畫面 Range Details 中顯示的堆疊會先依配置器分組: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 參數的值。
圖 9 顯示配置堆疊樹狀結構的組織方式。 圖 9. Range Details 檢視中的配置堆疊樹狀結構。 顯示 Range Details 檢視中配置堆疊樹狀結構的螢幕擷取畫面,其中每個最上層配置器群組都已展開以顯示第二層 Range Details 檢視包含 Unfreed Size、Allocated Size 與 Allocation Count 欄。Unfreed Size 欄中的非零值,表示在所選時間範圍內進行了配置,且在擷取結束時尚未釋放。 展開樹狀結構會顯示所選時間範圍內歸屬於該配置器之所有配置的彙總堆疊。Unfreed Size、Allocated Size 與 Allocation Count 欄的值一律相對於樹狀結構中目前選取的節點。圖 10 顯示函式 LeakMemorySometimes 進行了 316 次記憶體配置,且這些配置中有 3,481,272,320 個位元組在擷取結束時尚未釋放。 圖 10. 展開配置堆疊樹狀結構的一部分。 顯示配置堆疊樹狀結構的螢幕擷取畫面,其中 VirtualAlloc 群組的一部分已展開六層 此外,堆疊樹狀結構指出 LeakMemorySometimes 是在兩個不同的呼叫堆疊中被呼叫。第一個呼叫堆疊經過 Process 函式,第二個呼叫堆疊經過 UpdateEnemyPositions。這兩個函式的 Unfreed Size 欄指出,所有未釋放的記憶體都來自第一個呼叫堆疊,也就是包含 Process 的那一個。 在 Range Details 檢視中選取函式,會在 Element Details 檢視中填入該函式所配置與釋放之記憶體的其他資訊。Source Analysis 索引標籤會顯示原始程式碼清單,指出函式中有哪些行配置了記憶體 (圖 11)。 圖 11. 所選函式的 Element Details 檢視。 顯示所選函式之 Element Details 檢視的螢幕擷取畫面 根據預設,PIX 會使用遊戲 PDB 中儲存的原始程式檔路徑,來找出相符的原始程式檔。如果找不到該檔案,原始程式碼分析檢視會包含下列文字: Could not find “filename”.cpp with a matching checksum 使用 Display Options 面板或主要 Settings 頁面中的 Source Paths 控制項,指定一或多個目錄,供 PIX 在預設位置找不到原始程式檔時搜尋。Display Options 面板也可讓您自訂原始程式碼檢視以顯示原始值而非百分比,並選擇將資料顯示為 Allocated Size、Allocation Counts 或 Unfreed Size。 圖 12. 檢視原始程式碼的顯示選項 顯示檢視原始程式碼之顯示選項的螢幕擷取畫面 Range Details 檢視包含篩選列,可用來將檢視內容限制為包含特定字串的堆疊。除了字串搜尋之外,篩選列還包含 !Freed 按鈕 (圖 13),可將檢視限制為 Unfreed Size 值不為零的呼叫堆疊。 圖 13. 篩選列中的 !Freed 按鈕。 顯示 Range Details 檢視中配置堆疊樹狀結構篩選列之 !Freed 按鈕位置的螢幕擷取畫面 使用檢視右側的 Display Options 窗格,可以自訂 Range Details 檢視顯示配置堆疊樹狀結構的某些方式。您可以選取要顯示的欄,也可以反轉樹狀結構,讓被呼叫端出現在堆疊頂端而非底部。 圖 14. 配置堆疊樹狀結構的顯示選項。 顯示配置堆疊樹狀結構之 Display Options 窗格的螢幕擷取畫面 您也可以使用 Range Details 檢視查看使用 VirtualAlloc 進行之所有配置的平面清單。在 Items to Show 下拉式功能表中,選取 Virtual Memory Allocations 以檢視配置清單 (圖 15)。根據預設,清單會依時間排序,並包含 Size、Unfreed Size 與 Flags 等欄。 圖 15. 檢視虛擬記憶體配置。 顯示 Range Details 檢視中虛擬記憶體配置清單的螢幕擷取畫面;清單中選取了一個 VirtualAlloc 呼叫,其詳細資料顯示在 Element Details 檢視中

在時間軸中檢視分頁錯誤

分頁錯誤事件會在 Timeline 的執行緒與核心通道中繪製為黃色垂直線。 選取分頁錯誤事件,會在 Element Details 檢視中填入該事件的其他資訊,包括分頁錯誤的類型以及導致事件發生的呼叫堆疊 (圖 16)。 顯示執行緒與核心通道中分頁錯誤的螢幕擷取畫面 分頁錯誤事件會顯示在 Timeline 中,以便與遊戲中發生的停滯建立關聯。零需求分頁錯誤的成本特別高,因為分頁可能必須先歸零才能使用。當使用 XMemVirtualAlloc 配置 4K 分頁大小時,就會發生這種情況。

使用 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 通道。 顯示 Timeline 檢視中 Title Memory Used 通道的螢幕擷取畫面 在圖表中選取單一點,會在 Element Details 檢視中填入 Memory Usage Comparison 表格。此表格提供所選點的遊戲記憶體細分,以及自擷取開始以來遊戲記憶體量與細分如何變化的比較。在圖表中選取兩個點,可顯示兩點之間已配置記憶體量的差異。 Memory Usage Comparison 表格會顯示四個類別中使用的遊戲記憶體量。
  • **VirtualAlloc 已認可記憶體:**此總計不包含擷取開始之前透過呼叫 VirtualAlloc 配置的記憶體。
  • **映像使用量:**此類別代表用來儲存遊戲二進位映像的記憶體。
  • **實體分頁配置:**此總計包含擷取開始之前進行的配置。
  • **其他:**其他類別包含用來儲存分頁表項目、記憶體描述元清單與其他小型配置所用記憶體的遊戲記憶體。此總計包含擷取開始之前進行的配置。
在未來版本中,Memory Usage Comparison 表格將會擴充,以提供其他類別更詳細的細分。
圖 18 顯示在兩個所選點之間,使用中的遊戲記憶體量成長了 2.3 GB。 圖 18. Memory Usage Comparison 表格。 顯示在 Timeline 檢視中選取的兩個點,以及 Element Details 檢視中 Memory Usage Comparison 表格顯示兩點相關資訊與值差異的螢幕擷取畫面 您可以使用 Title Memory Used 通道、Range Details 檢視與 Element Details 檢視,進一步調查遊戲記憶體使用量的非預期增加。在 Title Memory Used 通道中選取時間範圍,即可在 Range Details 檢視中填入該時間範圍的所有擷取資料。在 Range Details 檢視中,從 Items to Show 選取 Virtual Memory Allocations,即可在事件表格中填入所有虛擬記憶體配置與釋放的平面清單。從 Items to Show 選取 Allocation Stack Tree,即可在事件表格中填入所選時間範圍內進行之所有配置 (包括虛擬記憶體配置) 的呼叫堆疊檢視。 在 Range Details 檢視中選取配置,會在 Element Details 中填入該配置的詳細資料,包括其呼叫堆疊。圖 19 顯示一個未釋放的配置,如 Range Details 中的 Unfreed Size 欄所示。 圖 19. 顯示未釋放配置的 Element Details 檢視。 顯示在 Timeline 檢視中選取的時間範圍、Range Details 檢視中虛擬記憶體配置的平面清單,以及 Element Details 檢視中未釋放配置資訊的螢幕擷取畫面 您可以使用通道設定面板設定 Title Memory Used 通道顯示方式的各個面向。在 Options for 下拉式功能表中,選取 Memory Usage Lanes 並自訂顯示設定 (圖 20)。 圖 20. 設定 Title Memory Used 通道。 顯示在 Timeline 檢視上開啟的 Lane Configuration 面板及 Memory Usage Lanes 選項的螢幕擷取畫面

依資料類型分析記憶體配置

除了記錄哪些函式與呼叫堆疊配置了記憶體之外,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。
圖 21. Range Details 檢視中的資料類型清單 顯示 Range Details 檢視中每種資料類型之記憶體配置的螢幕擷取畫面 記憶體大小預設以位元組顯示。使用 Display Options 面板中的 Size Units 下拉式清單可變更大小單位。 在 Range Details 檢視中選取類型,會在 Element Details 檢視中填入該類型每個欄位 (包括填補) 的大小資訊。選取巢狀類型名稱旁的 +,即可查看巢狀類型的詳細資料。圖 22 顯示一個包含 3 個填補欄位、總計 14 個位元組的類型。 圖 22. 資料類型的 Element Details 檢視 顯示所選資料類型之 Element Details 檢視的螢幕擷取畫面

使用 Memory 版面配置分析記憶體存取

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

執行記憶體分析

初次開啟擷取時,記憶體對應圖不會填入資料。若要填入對應圖,請在 Memory Usage 圖表中選取一段時間區域,從 Memory Type 下拉式清單中選取記憶體類型,然後按一下 Analyze 按鈕。 顯示用來開始記憶體存取分析之控制項的螢幕擷取畫面 記憶體對應圖依記憶體位址組織。對應圖中的每個方塊代表特定位址的記憶體配置。每個方塊的大小與配置的大小相對應。記憶體對應圖中的方塊會根據對應圖左側的圖例著色。下圖顯示依記憶體類型著色的記憶體對應圖:CPU、GPU 與 Tooling。 選取配置會在分析面板的 Allocation Details 索引標籤中填入該配置的詳細資訊,包括其位址、大小、分頁大小、配置器與呼叫堆疊。 顯示 Memory 版面配置上記憶體對應圖的螢幕擷取畫面 從 Color 下拉式清單中選取不同的值,會變更圖例以及記憶體對應圖中配置的色彩。在下圖中,記憶體對應圖依 XMem 標籤著色。 顯示使用不同色彩配置之記憶體對應圖的螢幕擷取畫面 可以使用 Lifetime、Designation、Allocation Size、Access Sample Count 與 Alloc Page Size 下拉式清單,以各種方式篩選記憶體對應圖中顯示的配置。例如,Lifetime 下拉式清單可用來篩選在所選時間內進行、但在分析時間範圍結束前未釋放的配置。這些配置代表潛在的記憶體流失。使用 Access Sample Count 篩選器只顯示從未被存取的配置,有助於找出已配置但從未使用的記憶體。

分析記憶體存取樣本

對所選時間區域執行記憶體動畫,即可取得每次記憶體存取的詳細資訊,包括存取發生時間點的時間軸連結及其呼叫堆疊。使用 Memory Animation 按鈕執行動畫。執行動畫時,PIX 會依時間順序處理每次記憶體存取,並在對應圖中反白顯示存取。記憶體讀取以一種色彩反白顯示,記憶體寫入則以另一種色彩反白顯示。下圖顯示動畫執行時的記憶體對應圖。 顯示記憶體對應圖動畫的螢幕擷取畫面 分析記憶體存取時,每個配置與存取的超連結與呼叫堆疊會填入對應圖右側的面板中。按一下超連結會瀏覽至時間軸中導致該記憶體存取的 CPU 樣本。 顯示每次記憶體存取之時間軸超連結的螢幕擷取畫面

Summary Analysis 樞紐分析表

Summary Analysis 索引標籤包含一個樞紐分析表,可用來分析所選時間區域內配置的記憶體總量。配置的記憶體量可依各種準則進行樞紐分析,包括 XMem 標籤、配置執行緒,以及呼叫堆疊與 PIX 事件樹狀結構。在下圖中,配置的記憶體總量先依執行緒,再依配置記憶體的呼叫堆疊進行樞紐分析。 顯示 Summary Analysis 索引標籤中樞紐分析表的螢幕擷取畫面 當摘要表格依 Allocation Stack Tree 或 Allocation PIX Event Stack 進行樞紐分析時,提供了壓縮堆疊框架的選項。如果堆疊樹狀結構中的節點只有一個子系,壓縮時會移除該子節點並以視覺指示器取代。壓縮堆疊樹狀結構可加快瀏覽樹狀結構中只有一個子系的部分。壓縮堆疊樹狀結構時,水平空間也會最佳化。若要壓縮堆疊,請從檢視中的設定圖示選取 Condense Frames 選項。 顯示 Summary Analysis 索引標籤中壓縮堆疊框架選項的螢幕擷取畫面

另請參閱

PIX PIX 自訂記憶體配置器 為遊戲與開發套件設定記憶體
最後修改於 2026年10月8日