> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 分析時間擷取中的 CPU 樣本

> 分析時間擷取中的 CPU 樣本

PIX 包含 CPU 取樣分析工具，可在進行[時間擷取](/zh-TW/tools/tools-console/pix/new-timing-captures)時選擇性執行。收集 CPU 樣本可讓您分析遊戲中的函式如何影響效能。

如需影片逐步解說，請參閱[分析 PIX 時間擷取中的 CPU 樣本](https://www.youtube.com/embed/Sq3-4sYh664)。

CPU 樣本通常是依據取樣間隔收集，但也可以依據效能監視計數器 (PMC) 值收集。例如，依據 PMC 溢出值收集 CPU 樣本，可讓您找出遊戲中造成最多資料快取遺漏的函式。

PIX 的取樣分析工具也包含 C++ 原始程式碼檢視。原始程式碼檢視會使用色彩將收集到的 CPU 樣本對應到原始程式碼行，藉此識別函式中的熱點。

[收集樣本](#collecting_samples)之後，可以在 [**Timeline**](#timeline_samples_analysis) 或 [**Range Details**](#range_details_samples_analysis) 檢視中分析樣本。在 **Timeline** 檢視中檢視樣本，有助於判斷在遊戲中 PIX 事件檢測稀少或完全沒有檢測的部分，執行緒或核心上正在執行哪些程式碼。在此情境中，使用 CPU 樣本診斷效能問題，會比在遊戲中新增額外檢測、重新建置並重新部署更有效率。在 **Range Details** 檢視中檢視樣本，可讓您分析在相對較長的擷取中所取得之 CPU 樣本的彙總檢視。以這種方式分析樣本，可用來找出最常執行以及執行時間最長的函式。

<a id="collecting_samples" />

## 收集 CPU 樣本

收集樣本之前，必須先設定 PIX 以找到遊戲的 PDB。PDB 中的符號資訊會用來顯示 PIX 所收集之 CPU 樣本的函式名稱。如需詳細資訊，請參閱[設定 PIX 存取 CPU PDB](/zh-TW/tools/tools-console/pix/pix-cpu-pdb-config)。

若要依據取樣間隔收集 CPU 樣本，請在時間擷取選項窗格的 **CPU** 區段中選取 **CPU Samples** 核取方塊。也必須使用 **Sampling Rate** 下拉式清單指定取樣間隔。取樣間隔的三個內建選項，可讓您在更多 CPU 樣本帶來的更高解析度，與更高取樣率所產生的額外負荷之間取得平衡。

若要依據 PMC 資料收集 CPU 樣本，請選取 **PMC Rollover Samples** 核取方塊。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-options.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=3c2c30b7d1f2fe5e1f31364e9b698630" alt="在時間擷取中收集 CPU 樣本" width="764" height="752" data-path="images/gdk/tools/pix-sampling-profiler-options.png" />

開啟時間擷取時，PIX 會在 **Timeline**、**Element Details** 與 **Range Details** 檢視中顯示所收集樣本的相關資訊。

<a id="timeline_samples_analysis" />

## 在 Timeline 檢視中分析 CPU 樣本

依據取樣間隔收集的個別 CPU 樣本，會在 **Timeline** 中的執行緒與核心通道上，以垂直黑線的形式顯示在執行緒或核心指示列的正上方。選取樣本會在 **Element Details** 檢視中填入該樣本的呼叫堆疊。

下圖顯示名為 **RunSimulation** 的 PIX 事件，該事件需要數毫秒才能完成，且沒有子 PIX 事件。選取個別樣本可提供更多詳細資料，了解在遊戲未以更細緻之 PIX 事件檢測的這段時間內，正在執行哪些程式碼。例如，查看下圖中所選樣本的呼叫堆疊，可以看出名為 **UpdateEnemyPositions** 的函式正在執行，且正在使用 **memcpy** 函式複製記憶體。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-timeline.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=4615674d13d837204f838a675a6bd919" alt="Timeline 與 Element Details 檢視中的 CPU 樣本" width="901" height="511" data-path="images/gdk/tools/pix-sampling-profiler-timeline.png" />

PIX 也會為每個執行緒建立 CPU 樣本的火焰圖。火焰圖會顯示在執行緒通道中 PIX 事件正下方的子通道中。火焰圖中每個函式的開始與結束時間以及持續時間都是近似值，因為此圖是使用樣本建立，而不是檢測每個函式的開頭與結尾。請注意，開始擷取前選擇的取樣率越高，火焰圖就越準確。

下圖顯示同一個 **UpdateEnemyPositions** 函式在 **RunSimulation** 底下執行，但火焰圖視覺效果提供了所執行函式的完整樹狀結構，因此能提供更多內容。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-timeline-flamegraph.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=b2068710e9379dc333f20175225468c7" alt="Timeline 中的 CPU 樣本火焰圖" width="962" height="663" data-path="images/gdk/tools/pix-sampling-profiler-timeline-flamegraph.png" />

[時間軸設定](/zh-TW/tools/tools-console/pix/new-timing-captures#lane_config) **Threads with Callstacks** 會自動為每個執行緒顯示 **PIX events** 與 **Sampled Functions** 子通道。

### 自訂 CPU 樣本的顯示

可以使用執行緒或核心通道旁的齒輪圖示，或使用 [**Lane Configuration**](/zh-TW/tools/tools-console/pix/new-timing-captures#lane_config) 面板，自訂 CPU 樣本的顯示方式。可以自訂代表樣本的垂直黑線高度，以及是否要在通道中顯示樣本，如下圖所示。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-config.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=871ca6cb671c5473868b243aa7c4128d" alt="自訂遊戲中 CPU 樣本的顯示" width="405" height="449" data-path="images/gdk/tools/pix-sampling-profiler-config.png" />

對於執行緒通道，也可以切換 **Sampled Functions** 子通道的顯示。

<a id="range_details_samples_analysis" />

## 使用 Range Details 檢視分析彙總的 CPU 樣本

在 **Timeline** 中選取時間範圍時，可以使用 **Range Details** 檢視查看所選時間範圍內發生之所有樣本的彙總。樣本會跨所有執行緒與核心彙總，並可以堆疊樹狀結構或平面函式清單的形式檢視。有數個選項可用來變更所顯示的樣本集合，以及自訂這些樣本在堆疊樹狀結構中的組織方式。如需詳細資訊，請參閱下列主題。

* [依執行緒或核心分組。](#samples_grouping)
* [依據 PMC 溢出值分析樣本](#samples_pmc)
* [依一或多個 PIX 事件限制所顯示的樣本集合](#samples_pixevents)
* [將函式指定為「焦點函式」。](#samples_focused_function)

從 **Range Details** 的 **Items to show** 下拉式清單中選取 **Sampled Functions**，即可檢視彙總的樣本。

以堆疊樹狀結構檢視彙總的樣本，可讓您查看所選時間範圍內最常出現的呼叫堆疊。對於堆疊樹狀結構中的每個函式，會以欄的形式顯示樣本落在該函式中的次數 (包含與不包含子系)，以及包含與不包含子系的百分比。

下圖顯示所選時間範圍的彙總堆疊樹狀結構。堆疊樹狀結構中的 **Inc %** 欄顯示，有 33.33% 的樣本發生在 **UpdateEnemyPositions** 函式或其子系中。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-aggregated-range-details.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=ffe4be7cbacfa71e92fb14f2b62dd475" alt="在 Range Details 檢視中以堆疊樹狀結構顯示的彙總 CPU 樣本" width="1208" height="776" data-path="images/gdk/tools/pix-sampling-profiler-aggregated-range-details.png" />

若要以平面清單檢視彙總的樣本，請開啟 **Display Options** 面板，並將滑桿從 **Stack Tree** 切換為 **Function List**。**Display Options** 面板也可用來自訂事件清單中顯示哪些欄。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-aggregated-range-details-flat-list.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=8c0a176584f486dd7d9020896275adfe" alt="在 Range Details 檢視中以平面函式清單顯示的彙總 CPU 樣本" width="1176" height="669" data-path="images/gdk/tools/pix-sampling-profiler-aggregated-range-details-flat-list.png" />

<a id="samples_grouping" />

### 依執行緒或核心將堆疊樹狀結構分組

根據預設，所有執行緒與核心的 CPU 樣本會在堆疊樹狀結構中分組在一起。不過，在某些情境中，您可能想將分析重點放在只從部分執行緒與核心收集的樣本上。**Display Options** 面板中的 **Group by** 下拉式清單提供依執行緒、核心，或先依核心再依執行緒將樹狀結構分組的選項。

選取分組選項後，堆疊樹狀結構會重新組織，依所選的分組選項，每個執行緒或核心各有一個根節點。下圖顯示依執行緒分組的堆疊樹狀結構。樹狀結構中的每個根節點都包含為單一執行緒收集的樣本。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-aggregated-tree-group-by.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=5489740b7f420f6b55b6fc624779bb24" alt="依執行緒分組的堆疊樹狀結構" width="1164" height="731" data-path="images/gdk/tools/pix-sampling-profiler-aggregated-tree-group-by.png" />

<a id="samples_pmc" />

### 依據 PMC 溢出值分析樣本

根據預設，**Range Details** 檢視中的堆疊樹狀結構與函式清單，是從依據取樣間隔收集的 CPU 樣本建立。依據間隔檢視樣本，可讓您知道哪些函式與呼叫路徑的執行時間最長或最常被呼叫。

堆疊樹狀結構與函式清單也可以從 PMC 值「溢出」(即達到特定發生次數) 時收集的樣本建立。依據 PMC 計數檢視樣本，可讓您知道在溢出事件發生時，正在執行哪些函式與呼叫路徑。例如，此分析可用來判斷哪些函式造成最多分支預測錯誤。

PIX 會從四個內建 PMC 收集樣本：

* 資料快取遺漏 (DcacheMisses)
* 分支預測錯誤 (BranchMispredictions)
* 資料快取存取 (DcacheAccesses)
* 總發出指令數 (TotalIssues)

從 **Profile Source** 下拉式清單中選取其中一個 PMC，即可依據 PMC 溢出值檢視樣本。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-pmc-profile-source.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=5503c64d84c35f169c6b7c4946e32df2" alt="將取樣函式檢視切換為依據 PMC 溢出" width="1125" height="380" data-path="images/gdk/tools/pix-sampling-profiler-pmc-profile-source.png" />

依據 PMC 溢出的 CPU 樣本，每當事件發生 64k 次時收集一次。例如，每發生 64k 次分支預測錯誤，就會收集一個 CPU 樣本。

<a id="samples_pixevents" />

### 使用 PIX 事件限制所顯示的樣本集合

堆疊樹狀結構或平面函式清單中顯示的樣本集合，可以限制為在一或多個 PIX 事件執行個體執行期間所收集的樣本。以這種方式限制樣本，可讓您分析在 [PIXBeginEvent](/zh-TW/reference/tools/pix3/functions/pixbeginevent) 與 [PIXEndEvent](/zh-TW/reference/tools/pix3/functions/pixendevent) 呼叫之間執行的函式。

使用 **Display Options** 索引標籤中的 **PIX Events** 篩選控制項，選取一或多個 PIX 事件。視遊戲發出的事件數量而定，篩選控制項一開始可能會指出事件太多而無法顯示。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-pix-event-too-many.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=cd86f36ae753a39ffda351e2d8b624ba" alt="PIX 事件篩選器中的事件太多" width="1110" height="387" data-path="images/gdk/tools/pix-sampling-profiler-pix-event-too-many.png" />

在下拉式清單中輸入字串，即可篩選 PIX 事件集合。下圖顯示篩選為包含字串 *Update* 之 PIX 事件的清單。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-pix-event-filtered.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=fdf01d3139f286f08aa28bc67cda68b8" alt="依包含字串 Update 的 PIX 事件篩選" width="263" height="308" data-path="images/gdk/tools/pix-sampling-profiler-pix-event-filtered.png" />

選取一或多個 PIX 事件，會使用在指定事件之所有執行個體執行時所收集的樣本，重新計算堆疊樹狀結構或函式清單。按一下 **Apply** 按鈕即可重建堆疊樹狀結構或函式清單。

下圖顯示在 PIX 事件 **Physics::Process** 執行個體執行時所收集之 CPU 樣本的堆疊樹狀結構。分組選項可用來依核心或執行緒組織樹狀結構。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-stack-tree-pix-event-filtered.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=1ce784b107a283ebea049e2bc758d967" alt="篩選為 PIX 事件期間發生之樣本的堆疊樹狀結構" width="1258" height="414" data-path="images/gdk/tools/pix-sampling-profiler-stack-tree-pix-event-filtered.png" />

<a id="samples_focused_function" />

### 聚焦於函式

將函式選取為「焦點函式」，會依據對該函式的所有呼叫重建堆疊樹狀結構。焦點函式會成為樹狀結構中的頂端節點，其完整呼叫樹狀結構則顯示為子系。以這種方式檢視樣本，可讓您分析函式的呼叫樹狀結構，找出最常被呼叫、執行時間最長等的呼叫路徑。

若要選取要聚焦的函式，請以滑鼠右鍵按一下 **Range Details** 檢視中的函式，然後從操作功能表中選擇 **Set Focus Function**，如下圖所示。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-focus-function-menu-option.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=b299f480e82fc0f2a23ed49f4d1b139f" alt="焦點函式操作功能表選項" width="1009" height="446" data-path="images/gdk/tools/pix-sampling-profiler-focus-function-menu-option.png" />

堆疊樹狀結構會以所選函式為焦點重建。依執行緒與核心分組，以及依據一或多個 PIX 事件限制樣本集合的選項，可用來進一步自訂資料的顯示方式。下圖顯示以 **UpdateEnemyPositions** 函式為焦點函式的堆疊樹狀結構。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-stack-tree-focus-function.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=4aa5347be3e81c8afe081b109014e46b" alt="聚焦於函式的堆疊樹狀結構" width="954" height="466" data-path="images/gdk/tools/pix-sampling-profiler-stack-tree-focus-function.png" />

## 取樣分析工具 C++ 原始程式碼檢視

取樣分析工具原始程式碼檢視可用來識別指定函式的熱點，也就是大多數樣本落在其上的程式碼行。

若要檢視函式的附註原始程式碼，請在 **Range Details** 檢視中選取該函式，並將 **Element Details** 檢視從 **Details** 切換為 **Source Analysis**，如下圖所示。

<img src="https://mintcdn.com/microsoft-4404708b/qucDZYz-Wliyj3GK/images/gdk/tools/pix-sampling-profiler-source-view.png?fit=max&auto=format&n=qucDZYz-Wliyj3GK&q=85&s=3c7416ffb955acd33db1d08b2c3e7b2d" alt="C++ 原始程式碼分析檢視" width="1421" height="554" data-path="images/gdk/tools/pix-sampling-profiler-source-view.png" />

指定原始程式碼行上反白顯示的深淺，與執行該行時所發生之樣本的百分比相關。行的顏色越深，表示該行執行得越頻繁。根據預設，原始程式碼檢視會以百分比顯示樣本頻率。如有需要，可以使用檢視上的 **Display Options** 面板，將顯示切換為樣本計數。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-sample-counts.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=e0e26f18c50067cd989c98327c85c063" alt="在 C++ 原始程式碼分析檢視中檢視樣本計數" width="668" height="551" data-path="images/gdk/tools/pix-sampling-profiler-sample-counts.png" />

取樣分析工具會使用遊戲 PDB 中儲存的原始程式檔路徑，來找出相符的原始程式檔。如果找不到該檔案，原始程式碼分析檢視會包含下列文字：

*Could not find "filename".cpp with a matching checksum*

使用 **Display Options** 面板或主要 **Settings** 頁面中的 **Source Paths** 控制項，指定一或多個目錄，供 PIX 在預設位置找不到原始程式檔時搜尋。

<img src="https://mintcdn.com/microsoft-4404708b/stYRJgFi22xot4tO/images/gdk/tools/pix-sampling-profiler-source-paths.png?fit=max&auto=format&n=stYRJgFi22xot4tO&q=85&s=aad6b525c4a6eafdb1af072849d261a2" alt="新增自訂原始程式碼搜尋路徑" width="1419" height="612" data-path="images/gdk/tools/pix-sampling-profiler-source-paths.png" />

## 另請參閱

[時間擷取](/zh-TW/tools/tools-console/pix/new-timing-captures)

[PIX](/zh-TW/tools/tools-console/pix/pix)


## Related topics

- [PIX 影片](/zh-TW/tools/tools-console/pix/pix-videos.md)
- [適用於 GDK 遊戲的 XBOX 與 Windows 版 PIX](/zh-TW/tools/tools-console/pix/index.md)
- [PIX GPU 擷取與效能分析](/zh-TW/tools/tools-console/pix/gpu/index.md)
- [NDA 主題目錄 - Microsoft Learn 線上連結](/zh-TW/nda/nda-topic-directory.md)
- [分析實驗](/zh-TW/services/playfab/live-service-management/game-configuration/experiments/analyze-experiments.md)
