次の方法で共有


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 を任意の時点で呼び出すことによってフレームドロップを検出できます。 実際には、次の操作を実行できます。

  1. バック バッファーにレンダリングする
  2. 通話の現在の呼び出し
  3. GetPresentStats を呼び出し、結果の D3DPRESENTSTATS 構造体を格納します
  4. 次のフレームをバック バッファーにレンダリングする
  5. 通話の現在の呼び出し
  6. 手順 4 と 5 を 1 回以上繰り返します
  7. GetPresentStats を呼び出し、結果の D3DPRESENTSTATS 構造体を格納します
  8. 格納されている 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 に対応します。

アプリケーション コードは、次のシーケンスのようになります。

  1. フレーム A をバック バッファーにレンダリングする
  2. 通話の現在、PresentCount = 1
  3. GetPresentStats を呼び出し、結果の D3DPRESENTSTATS 構造体を格納します
  4. 次の 4 フレーム、B、C、D、E をそれぞれレンダリングします
  5. 通話現在 4 回、PresentCounts = 2、3、7、8、それぞれ
  6. GetPresentStats を呼び出し、結果の D3DPRESENTSTATS 構造体を格納します
  7. 格納されている 2 つの D3DPRESENTSTATS 構造体の PresentRefreshCount の値を比較します。 差が 2 の場合、つまり、2 つの GetPresentStats API 呼び出しの間に 2 つの vblank 間隔が経過した場合、最後に提示されたフレームはフレーム C になります。アプリケーションは 1 回非常に vblank 間隔 (モニターのリフレッシュ レート) を示すので、フレーム A が表示されるまでとフレーム C が表示されるまでの経過時間は 2 vblanks である必要があります。
  8. 格納されている 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 間隔内ですぐに処理されることをランタイムに示します。実質的には画面には表示されません。 前の例の最後の手順の後のアプリケーションの使用例を次に示します。

  1. 次のフレームをバック バッファーにレンダリングする
  2. PresentRefreshCount から、次のフレームが既に遅れていることを検出する
  3. [現在の間隔] を [D3DPRESENT_FORCEIMMEDIATE] に設定します
  4. 次のフレームで Present を呼び出す

GetPresentStatistics の動作は、そのシナリオでは変更されないため、アプリケーションはビデオ ストリームとオーディオ ストリームを同じ方法で同期できます。

D3D9Ex Flip Mode は、ウィンドウ化されたアプリケーションと全画面表示 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. 格納されている 2 つの D3DPRESENTSTATS 構造体の SyncRefreshCount の値を比較します。 差が 1 より大きい場合、フレームはスキップされました。

要件

要件
ヘッダー
D3d9types.h

関連項目

Direct3D 構造体