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 來偵測框架卸載。 實際上,他們可以執行下列動作。

  1. 轉譯至後端緩衝區
  2. 通話簡報
  3. 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構
  4. 將下一個框架轉譯至背景緩衝區
  5. 通話簡報
  6. 重複步驟 4 和 5 一或多次
  7. 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構
  8. 比較來自兩個預存 D3DPRESENTSTATS 結構之 PresentRefreshCount 的值。 應用程式可以根據 PresentRefreshCount 遞增和框架簡報的 PresentCount 指派假設,計算特定 PresentCount 參數的對應 PresentRefreshCount。 如果 PresentRefreshCount 最後取樣不符合 PresentCount (,亦即如果 PresentRefreshCount 已遞增,但 PresentCount 尚未遞增,則畫面已卸載。)

應用程式可以藉由取樣 PresentCount 和 GetPresentStats 的任何兩個實例來判斷框架是否已卸載,方法是在任何兩個時間點呼叫 GetPresentStat (s API) 。 例如,以與監視器重新整理速率相同的速率呈現的媒體應用程式 (例如,監視器重新整理速率為 60Hz,應用程式每隔 1/60 秒就會顯示一個畫面,) 想要呈現畫面 A、B、C、D、E,每個對應至 PresentCOUNT (PresentCount) 1、2、3、7、8。

應用程式程式碼看起來像下列順序。

  1. 將框架 A 轉譯至背景緩衝區
  2. 呼叫 Present,PresentCount = 1
  3. 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構
  4. 分別轉譯下 4 個畫面格 B、C、D、E
  5. 分別呼叫 Present 4 次、PresentCounts = 2、3、7、8
  6. 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構
  7. 比較來自兩個預存 D3DPRESENTSTATS 結構之 PresentRefreshCount 的值。 如果差異為 2,也就是兩個 GetPresentStats API 呼叫之間已經過 2 個 vblank 間隔,則最後一個呈現的框架應該是框架 C。由於應用程式在) (非常 vblank 的間隔呈現一次,所以呈現畫面 A 和顯示畫面 C 的時間應該為 2 個 vblank。
  8. 比較來自兩個預存 D3DPRESENTSTATS 結構的 PresentCount 值。 如果第一個 PresentCount 是 1 (對應至框架 A) ,而第二個 PresentCount 是對應至框架 C) 的 3 (,則不會卸載任何畫面。 如果第二個 PresentCount 是 3,對應至框架 D,則應用程式會知道已卸載一個畫面。

請注意,不論 FLIPEX 模式 PresentEx 呼叫的狀態為何,GetPresentStatistics 都會在呼叫之後進行處理。

Windows Vista:Present 呼叫會排入佇列,然後在處理 GetPresentStats 呼叫之前處理。

當應用程式偵測到特定畫面的呈現落後時,它可以略過這些畫面,並更正簡報以與 vblank 重新同步處理。 若要這樣做,應用程式可以直接轉譯晚期畫面,並開始在佇列中使用下一個正確的畫面進行轉譯。 不過,如果應用程式已經啟動晚期畫面的轉譯,它可以在 D3D9Ex 中使用名為 D3DPRESENT_FORCEIMMEDIATE 的新 Present 參數。 旗標將會在 Present API 呼叫的參數中傳遞,並指出框架會在下一個 vblank 間隔內立即處理,實際上完全看不到在螢幕上。 以下是上一個範例最後一個步驟之後的應用程式使用範例。

  1. 將下一個框架轉譯至背景緩衝區
  2. 從 PresentRefreshCount 探索下一個畫面已晚
  3. 將 [目前間隔] 設定為 [D3DPRESENT_FORCEIMMEDIATE
  4. 在下一個畫面上呼叫 Present

應用程式可以以相同方式同步處理視訊和音訊資料流程,因為 GetPresentStatistics 的行為不會在該案例中變更。

D3D9Ex 翻轉模式會將框架統計資料資訊提供給視窗化應用程式和全螢幕 9Ex 應用程式。

Windows Vista:使用 DWM API 來擷取目前統計資料。

關閉桌面視窗管理員時,使用翻轉模式的視窗模式 9Ex 應用程式會收到有限精確度的統計資料資訊。

**Windows Vista: **

如果應用程式的速度不夠快,無法跟上監視器的重新整理速率,可能是因為硬體變慢或系統資源不足,所以可能會發生圖形問題。 問題是所謂的視覺隱藏。 如果監視器設定為在 60 Hz 重新整理,而且應用程式只能管理 30 fps,則畫面的一半會有問題。

應用程式可以追蹤 SynchRefreshCount 來偵測問題。 例如,應用程式可能會執行下列動作順序。

  1. 轉譯回後端緩衝區。
  2. 呼叫 Present。
  3. 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構。
  4. 將下一個畫面呈現回緩衝區。
  5. 呼叫 Present。
  6. 呼叫 GetPresentStats 並儲存產生的 D3DPRESENTSTATS 結構。
  7. 從兩個預存的 D3DPRESENTSTATS 結構比較 SyncRefreshCount 的值。 如果差異大於一,則會略過框架。

規格需求

需求
標頭
D3d9types.h

另請參閱

Direct3D 結構