跳轉到主要內容
本主題說明如何使用 PIX 分析停滯與內容切換。當 CPU 核心從執行某個執行緒上的程式碼,切換為執行另一個執行緒上的程式碼或進入閒置時,就會發生內容切換。當作業系統切換在 CPU 上執行的執行緒時,必須為被切出的執行緒與被切入的執行緒儲存及還原狀態。此狀態 (或稱內容) 包括所有暫存器的目前值與程式計數器等資料。從效能角度來看,儲存與還原此狀態的成本很高,因此減少內容切換的整體次數,往往是達成可預測且一致之畫面時間的關鍵。 如需影片逐步解說,請參閱 PIX 的執行緒相依性。 內容切換可能因各種原因發生,例如執行緒在等候同步處理物件,或作業系統排程器判斷執行緒的時間配量已到期 (且另一個執行緒已就緒可在該核心上執行)。 PIX 中的時間擷取有多項功能,可協助您判斷內容切換何時發生,並分析每次切換的原因。

收集內容切換資料

若要分析內容切換,您需要收集每次內容切換的呼叫堆疊。若要收集呼叫堆疊,請在開始擷取之前確認已選取 Callstacks on context switches 核取方塊 (圖 1)。此核取方塊預設為已選取。 圖 1. Start Timing Capture 的 Options 窗格。 顯示 Start Timing Capture 之 Options 窗格中 Callstacks on context switches 核取方塊位置的螢幕擷取畫面 選取 Callstacks on context switches 時,您也可以選擇收集就緒執行緒的呼叫堆疊。如果您熟悉執行緒之間的互動方式,或許不需要就緒執行緒的呼叫堆疊也能執行分析。在這種情況下,您可以不收集這些呼叫堆疊,以降低進行時間擷取的執行階段額外負荷。

尋找停滯與內容切換

根據預設,內容切換會在時間軸的執行緒與核心通道中顯示為小型的紅色垂直線。執行緒未執行的時段,稱為「未排程執行緒時間」或「停滯」,預設會以交叉陰影圖樣繪製。每個停滯的開頭都以切出的內容切換為界,結尾則以切回的內容切換為界。內容切換與停滯的預設視覺效果如圖 2 所示。 圖 2. 內容切換與停滯的預設視覺效果。 顯示內容切換與停滯之預設視覺效果的附註螢幕擷取畫面 如果您檢視時間擷取的目的是專門尋找並分析內容切換,可以變更預設的視覺效果,讓切換更容易看見。使用通道設定窗格中的 Bold Context Switches 選項,可將識別內容切換的紅色垂直線延伸至執行緒或核心通道的完整高度 (圖 3)。 圖 3. Bold Context Switches 選項的位置與效果。 顯示 Bold Context Switches 選項之位置與效果的螢幕擷取畫面 若要快速識別 PIX 事件執行期間發生的停滯與內容切換,請在 Timeline 或 Range Details 檢視中選取該事件。Element Details 檢視中的資訊包括依發生順序排列的所有停滯清單。例如,圖 4 顯示名為 UpdatePlayerArmor 之事件的一個執行個體,該執行個體有八次停滯。 圖 4. 顯示所選事件的停滯。 顯示在 Timeline 檢視中選取的事件以及 Element Details 窗格中停滯清單的螢幕擷取畫面 內容切換也會出現在 Range Details 檢視中。若要查看某個時段內所有內容切換的清單,請開啟 Items to show 下拉式功能表,然後選取 Context switches。若要從內容切換清單中排除特定核心,請使用檢視左側的 Selector 面板 (圖 5)。 圖 5. Range Details 檢視中的內容切換。 顯示 Range Details 檢視中內容切換詳細資料的螢幕擷取畫面

分析停滯與內容切換

在 Timeline 或 Range Details 檢視中選取內容切換,會在 Element Details 檢視中填入該內容切換的相關資訊。Element Details 會顯示發生切換的核心、切換發生的時間,以及切換前正在執行之執行緒與切換後正在執行之執行緒 (若有) 的呼叫堆疊。也會顯示每個執行緒的執行緒親和性與優先順序資料。圖 6 顯示遊戲的 AppMain 執行緒呼叫 Win32 API ReadFile 造成內容切換。呼叫之後,AppMain 從執行中轉換為閒置。 圖 6. 內容切換的詳細資料。 顯示內容切換詳細資料的螢幕擷取畫面 如果執行緒因為另一個執行緒上發生的動作而開始執行,Timeline 與 Element Details 檢視都會顯示來自設為就緒之執行緒的資訊。圖 7 中的內容切換顯示,核心 0 從閒置轉為執行 AppMain 執行緒,而 AppMain 是由名為 Worker 的執行緒設為就緒。Element Details 檢視包括設為就緒之執行緒的呼叫堆疊、就緒時間與就緒原因。在時間軸中,會有一個箭號從設為就緒的執行緒 (Worker) 延伸到現在正在執行的執行緒 (AppMain)。 圖 7. 設為就緒之執行緒的詳細資料。 顯示內容切換之設為就緒執行緒相關資訊的螢幕擷取畫面 如果內容切換涉及非遊戲處理程序,PIX 會在 Element Details 中顯示處理程序名稱與識別碼。圖 8 來自 PIX on Windows 擷取,顯示核心 0 從執行非遊戲處理程序 devenv.exe 切換為執行名為 AP1 的遊戲執行緒。在此案例中,等候原因指出此切換是因作業系統的執行緒排程器而發生。 圖 8. 從非遊戲處理程序切出之內容切換的詳細資料。 顯示涉及另一個處理程序之內容切換的螢幕擷取畫面 您不限於選取個別內容切換。您可以選取整個停滯,以快速存取三個相關的呼叫堆疊:切出時的呼叫堆疊、切回時的呼叫堆疊,以及設為就緒之執行緒 (若有) 的呼叫堆疊。這些呼叫堆疊會與停滯的其他資訊 (包括其持續時間) 一起顯示在 Element Details 中 (圖 9)。 圖 9. 所選停滯的詳細資料。 顯示所選執行緒停滯相關資訊的螢幕擷取畫面

另請參閱

時間擷取 PIX
最後修改於 2026年10月8日