共用方式為


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 的任何兩個實例 (來判斷框架是否已卸載,方法是在任何兩個時間點呼叫 GetPresentStats API) 。 例如,以與監視器重新整理速率相同的速率呈現的媒體應用程式 (例如,監視器重新整理速率為 60Hz,應用程式每隔 1/60 秒顯示一個畫面,) 想要呈現 A、B、C、D、E 畫面格,分別對應至 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。因為應用程式會在) 監視器的重新整理速率 (出現一次,所以呈現畫面 A 和呈現畫面 C 的時間應該為 2 個 vblank。
  8. 比較來自兩個預存 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 間隔內立即處理,實際上完全看不到在螢幕上。 以下是上一個範例的最後一個步驟之後的應用程式使用範例。

  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 結構