D3DPRESENTSTATS 構造体
PresentEx 呼び出しに関連するスワップチェーン統計について説明します。
構文
typedef struct _D3DPRESENTSTATS {
UINT PresentCount;
UINT PresentRefreshCount;
UINT SyncRefreshCount;
LARGE_INTEGER SyncQPCTime;
LARGE_INTEGER SyncGPUTime;
} D3DPRESENTSTATS;
メンバー
-
PresentCount
-
型: UINT
-
成功した現在画面に出力されているディスプレイ デバイスによって行われた呼び出しの実行数。 このパラメーターは実際には、最後の Present 呼び出しの Present ID であり、必ずしも行われた Present API 呼び出しの合計数ではありません。
-
PresentRefreshCount
-
型: UINT
-
最後の Present が画面に表示された vblank カウント。vblank カウントは vblank 間隔ごとに 1 回インクリメントされます。
-
SyncRefreshCount
-
型: UINT
-
スケジューラが QueryPerformanceCounter を呼び出してマシン時刻を最後にサンプリングしたときの vblank カウント。
-
SyncQPCTime
-
種類: LARGE_INTEGER
-
QueryPerformanceCounter を呼び出して取得された、スケジューラの最後にサンプリングされたマシン時間。
-
SyncGPUTime
-
種類: LARGE_INTEGER
-
この値は使用されません。
解説
9Ex アプリケーションが Flip Mode present (D3DSWAPEFFECT_FLIPEX) を採用している場合、アプリケーションは GetPresentStatistics を任意の時点で呼び出すことによってフレームドロップを検出できます。 実際には、次の操作を実行できます。
- バック バッファーにレンダリングする
- 通話の現在の呼び出し
- GetPresentStats を呼び出し、結果の D3DPRESENTSTATS 構造体を格納します
- 次のフレームをバック バッファーにレンダリングする
- 通話の現在の呼び出し
- 手順 4 と 5 を 1 回以上繰り返します
- GetPresentStats を呼び出し、結果の D3DPRESENTSTATS 構造体を格納します
- 格納されている 2 つの D3DPRESENTSTATS 構造体の PresentRefreshCount の値を比較します。 アプリケーションは、PresentRefreshCount インクリメントとフレーム 提示の PresentCount 割り当ての前提条件に基づいて、特定の PresentCount パラメーターの対応する PresentRefreshCount を計算できます。 最後にサンプリングされた PresentRefreshCount が PresentCount と一致しない場合 (つまり、PresentRefreshCount がインクリメントされたが PresentCount がインクリメントされていない場合は、フレームが削除されました)。
アプリケーションは、PresentCount と GetPresentStats の 2 つのインスタンスをサンプリングすることによって (任意の 2 つの時点で GetPresentStats API を呼び出すことによって) フレームが削除されたかどうかを判断できます。 たとえば、モニターのリフレッシュ レートと同じレートで表示されているメディア アプリケーション (たとえば、モニターの更新レートが 60Hz で、アプリケーションは 1/60 秒ごとにフレームを提示します)、フレーム A、B、C、D、E を提示する必要があり、それぞれが Present ID (PresentCount) 1、2、3、7、8 に対応します。
アプリケーション コードは、次のシーケンスのようになります。
- フレーム A をバック バッファーにレンダリングする
- 通話の現在、PresentCount = 1
- GetPresentStats を呼び出し、結果の D3DPRESENTSTATS 構造体を格納します
- 次の 4 フレーム、B、C、D、E をそれぞれレンダリングします
- 通話現在 4 回、PresentCounts = 2、3、7、8、それぞれ
- GetPresentStats を呼び出し、結果の D3DPRESENTSTATS 構造体を格納します
- 格納されている 2 つの D3DPRESENTSTATS 構造体の PresentRefreshCount の値を比較します。 差が 2 の場合、つまり、2 つの GetPresentStats API 呼び出しの間に 2 つの vblank 間隔が経過した場合、最後に提示されたフレームはフレーム C になります。アプリケーションは 1 回非常に vblank 間隔 (モニターのリフレッシュ レート) を示すので、フレーム A が表示されるまでとフレーム C が表示されるまでの経過時間は 2 vblanks である必要があります。
- 格納されている 2 つの D3DPRESENTSTATS 構造体の PresentCount の値を比較します。 最初の PresentCount が 1 (フレーム A に対応) で、2 番目の PresentCount が 3 (フレーム C に対応) の場合、フレームは削除されません。 2 番目の PresentCount が 3 で、フレーム D に対応する場合、アプリケーションは 1 つのフレームが削除されたことを認識します。
GETPresentStatistics は、FLIPEX モード PresentEx 呼び出しの状態に関係なく、呼び出された後に処理されることに注意してください。
Windows Vista: Present 呼び出しはキューに登録され、GetPresentStats 呼び出しが処理される前に処理されます。
アプリケーションは、特定のフレームのプレゼンテーションが背後にあることを検出すると、それらのフレームをスキップし、プレゼンテーションを修正して vblank と再同期できます。 これを行うために、アプリケーションは遅延フレームをレンダリングして、キュー内の次の正しいフレームでレンダリングを開始することはできません。 ただし、アプリケーションが遅延フレームのレンダリングを既に開始している場合は、D3D9Ex で D3DPRESENT_FORCEIMMEDIATE という新しい Present パラメーターを使用できます。 フラグは Present API 呼び出しのパラメーターで渡され、フレームが次の vblank 間隔内ですぐに処理されることをランタイムに示します。実質的には画面には表示されません。 前の例の最後の手順の後のアプリケーションの使用例を次に示します。
- 次のフレームをバック バッファーにレンダリングする
- PresentRefreshCount から、次のフレームが既に遅れていることを検出する
- [現在の間隔] を [D3DPRESENT_FORCEIMMEDIATE] に設定します
- 次のフレームで Present を呼び出す
GetPresentStatistics の動作は、そのシナリオでは変更されないため、アプリケーションはビデオ ストリームとオーディオ ストリームを同じ方法で同期できます。
D3D9Ex Flip Mode は、ウィンドウ化されたアプリケーションと全画面表示 9Ex アプリケーションにフレーム統計情報を提供します。
Windows Vista: 現在の統計情報を取得するために DWM API を使用します。
デスクトップ ウィンドウ マネージャーをオフにすると、フリップ モードを使用するウィンドウ モード 9Ex アプリケーションは、限られた精度の統計情報を受け取ります。
Windows Vista:
ハードウェアの速度が遅い、またはシステム リソースが不足している可能性があるために、モニターの更新速度に追いつくには、アプリケーションの速度が十分でない場合は、グラフィックスの不具合が発生する可能性があります。 グリッチは、いわゆる視覚的なしゃっくりです。 モニターが 60 Hz で更新するように設定されていて、アプリケーションが 30 fps のみを管理できる場合、フレームの半分に不具合が発生します。
アプリケーションでは、SynchRefreshCount を追跡することで、不具合を検出できます。 たとえば、アプリケーションが次の一連のアクションを実行する場合があります。
- バック バッファーにレンダリングします。
- Present を呼び出します。
- GetPresentStats を呼び出し、結果の D3DPRESENTSTATS 構造体を格納します。
- 次のフレームをバック バッファーにレンダリングします。
- Present を呼び出します。
- GetPresentStats を呼び出し、結果の D3DPRESENTSTATS 構造体を格納します。
- 格納されている 2 つの D3DPRESENTSTATS 構造体の SyncRefreshCount の値を比較します。 差が 1 より大きい場合、フレームはスキップされました。
要件
要件 | 値 |
---|---|
ヘッダー |
|
関連項目