D3DPRESENTSTATS 結構
描述 與 PresentEx 呼叫相關的交換鏈統計資料。
語法
typedef struct _D3DPRESENTSTATS {
UINT PresentCount;
UINT PresentRefreshCount;
UINT SyncRefreshCount;
LARGE_INTEGER SyncQPCTime;
LARGE_INTEGER SyncGPUTime;
} D3DPRESENTSTATS;
成員
-
PresentCount
-
類型: UINT
-
正在執行目前輸出到螢幕的顯示裝置所發出之成功 Present 呼叫的計數。 此參數實際上是最後一個 Present 呼叫的 Present 識別碼,不一定是目前 API 呼叫的總數。
-
PresentRefreshCount
-
類型: UINT
-
在畫面上顯示最後一個 Present 的 vblank 計數,vblank 計數會每一個 vblank 間隔遞增一次。
-
SyncRefreshCount
-
類型: UINT
-
當排程器上次呼叫 QueryPerformanceCounter 來取樣電腦時間時,vblank 計數。
-
SyncQPCTime
-
類型: LARGE_INTEGER
-
排程器上次取樣的電腦時間,藉由呼叫 QueryPerformanceCounter取得。
-
SyncGPUTime
-
類型: LARGE_INTEGER
-
不使用這個值。
備註
當 9Ex 應用程式採用翻轉模式存在 (D3DSWAPEFFECT_FLIPEX) 時,應用程式可以在任何時間點呼叫 GetPresentStatistics 來偵測框架捨棄。 實際上,他們可以執行下列動作。
- 轉譯至背景緩衝區
- 通話簡報
- 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構
- 將下一個畫面轉譯到上一個緩衝區
- 通話簡報
- 重複步驟 4 和 5 一或多次
- 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構
- 比較來自兩個預存 D3DPRESENTSTATS 結構的 PresentRefreshCount 值。 應用程式可以根據 PresentRefreshCount 遞增的假設,以及畫面呈現的 PresentCount 指派,計算特定 PresentCount 參數的對應 PresentRefreshCount。 如果 PresentRefreshCount 上次取樣不符合 PresentCount (亦即,如果 PresentRefreshCount 已遞增,但 PresentCount 尚未遞增,則會卸載框架。)
應用程式可以藉由取樣 PresentCount 和 GetPresentStats 的任何兩個實例 (來判斷框架是否已卸載,方法是在任何兩個時間點呼叫 GetPresentStats API) 。 例如,以與監視器重新整理速率相同的速率呈現的媒體應用程式 (例如,監視器重新整理速率為 60Hz,應用程式每隔 1/60 秒顯示一個畫面,) 想要呈現 A、B、C、D、E 畫面格,分別對應至 PresentCount () 1、2、3、7、8。
應用程式程式碼看起來像下列順序。
- 將框架 A 轉譯到背景緩衝區
- 呼叫 Present,PresentCount = 1
- 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構
- 分別轉譯接下來 4 個畫面格 B、C、D、E
- 分別呼叫 Present 4 次、PresentCounts = 2、3、7、8
- 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構
- 比較來自兩個預存 D3DPRESENTSTATS 結構的 PresentRefreshCount 值。 如果差異為 2,也就是兩個 GetPresentStats API 呼叫之間已經過 2 個 vblank 間隔,則最後呈現的畫面應該是畫面 C。因為應用程式會在) 監視器的重新整理速率 (出現一次,所以呈現畫面 A 和呈現畫面 C 的時間應該為 2 個 vblank。
- 比較來自兩個預存 D3DPRESENTSTATS 結構的 PresentCount 值。 如果第一個 PresentCount 是 1 (對應至框架 A) ,而第二個 PresentCount 是 3 (對應至框架 C) ,則不會卸載任何畫面。 如果第二個 PresentCount 是 3,對應至框架 D,則應用程式會知道已卸載一個框架。
請注意,不論 FLIPEX 模式 PresentEx 呼叫的狀態為何,GetPresentStatistics 都會在呼叫之後進行處理。
Windows Vista: Present 呼叫會排入佇列,然後在處理 GetPresentStats 呼叫之前進行處理。
當應用程式偵測到特定畫面格的呈現落後時,可以略過這些畫面,並更正簡報以與 vblank 重新同步處理。 若要這樣做,應用程式可以直接轉譯晚期畫面,並開始使用佇列中的下一個正確畫面進行轉譯。 不過,如果應用程式已經啟動晚期畫面的轉譯,它可以在 D3D9Ex 中使用名為 D3DPRESENT_FORCEIMMEDIATE 的新 Present 參數。 旗標會在 Present API 呼叫的參數中傳遞,並指示執行時間,畫面會在下一個 vblank 間隔內立即處理,實際上完全看不到在螢幕上。 以下是上一個範例的最後一個步驟之後的應用程式使用範例。
- 將下一個畫面轉譯到上一個緩衝區
- 從 PresentRefreshCount 探索下一個畫面已晚
- 將 [目前間隔] 設定為 [D3DPRESENT_FORCEIMMEDIATE
- 在下一個畫面上呼叫 Present
應用程式可以使用相同的方式同步處理視訊和音訊串流,因為 GetPresentStatistics 的行為不會在該案例中變更。
D3D9Ex 翻轉模式提供框架統計資料資訊給視窗應用程式和全螢幕 9Ex 應用程式。
Windows Vista: 使用 DWM API 來擷取目前統計資料。
當桌面視窗管理員關閉時,使用翻轉模式的視窗模式 9Ex 應用程式將會收到有限精確度的統計資料資訊。
Windows Vista:
如果應用程式的速度不夠快,無法跟上監視器的重新整理速率,可能是因為硬體變慢或系統資源不足,所以可能會發生圖形問題。 問題是所謂的視覺隱藏。 如果監視器設定為在 60 Hz 重新整理,且應用程式只能管理 30 fps,則一半的畫面格會有問題。
應用程式可以追蹤 SynchRefreshCount 來偵測問題。 例如,應用程式可能會執行下列動作順序。
- 轉譯至背景緩衝區。
- 呼叫 Present。
- 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構。
- 將下一個畫面呈現到背景緩衝區。
- 呼叫 Present。
- 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構。
- 比較來自兩個預存 D3DPRESENTSTATS 結構的 SyncRefreshCount 值。 如果差異大於一,則會略過框架。
規格需求
需求 | 值 |
---|---|
標頭 |
|
另請參閱