次の方法で共有


D3DSWAPEFFECT

スワップ エフェクトを定義します。

typedef enum D3DSWAPEFFECT
{
    D3DSWAPEFFECT_DISCARD = 1,
    D3DSWAPEFFECT_FLIP = 2,
    D3DSWAPEFFECT_COPY = 3,
    D3DSWAPEFFECT_OVERLAY = 4,
    D3DSWAPEFFECT_FLIPEX = 5,
    D3DSWAPEFFECT_FORCE_DWORD = 0xFFFFFFFF,
} D3DSWAPEFFECT, *LPD3DSWAPEFFECT;

定数

  • D3DSWAPEFFECT_DISCARD
    D3DSWAPEFFECT_FLIP または D3DSWAPEFFECT_COPY のスワップ エフェクトを使ってスワップ チェーンを作成するときに、ランタイムは IDirect3DDevice9::Present 処理がどのバック バッファーの内容にも影響を与えないようにします。しかし、このためにビデオ メモリーや画像処理で相当のオーバーヘッドが発生することがあります。特に、ウィンドウ スワップ チェーンのフリップ セマンティクスや、フルスクリーン スワップ チェーンのコピー セマンティクスを実装する場合などに顕著です。アプリケーションでは D3DSWAPEFFECT_DISCARD スワップ エフェクトを使うことで、これらのオーバーヘッドを回避することができ、最も効率的なスワップ チェーンの表現方法をディスプレイ ドライバー側で選択できます。これは D3DPRESENT_PARAMETERS の MultiSampleType メンバーに対して D3DMULTISAMPLE_NONE 以外の値を指定するときに使用できる唯一のスワップ エフェクトでもあります。 D3DSWAPEFFECT_FLIP を使用するスワップ チェーンと同様、D3DSWAPEFFECT_DISCARD を使用するスワップ チェーンにも複数のバック バッファーが含まれることがありますが、どのバック バッファーにも IDirect3DDevice9::GetBackBuffer または IDirect3DSwapChain9::GetBackBuffer を使ってアクセスすることができます。スワップ チェーンは待ち行列と見なすことができます。この待ち行列の中では、次回の Present 処理で表示されるバック バッファーのインデックスは常に 0 となり、いったん表示されたバッファーは待ち行列から破棄されます。 このスワップ エフェクトを使用するアプリケーションでは、破棄されたバック バッファーの内容を想定できません。したがって、バック バッファー全体を更新した後に、破棄されたバック バッファーの内容を表示する Present 処理を呼び出す必要があります。デバッグ バージョンのランタイムは破棄されたバック バッファーの内容を任意のデータで上書きするので、Present 処理を使用すればアプリケーションがバック バッファー サーフェス全体を正しく更新しているかを確認できます。Present 処理による確認をお勧めします。

  • D3DSWAPEFFECT_FLIP
    スワップ チェーンには複数のバック バッファーが含まれることがあり、フロント バッファーを含んだ巡回待ち行列と見なすことができます。この待ち行列のバック バッファーには、常に 0 から (n - 1) (n はバック バッファーの数) までの連続した数字が付けられます。したがって、0 はプレゼンテーションされるバッファーのうちで最も古いバッファーを示すことになります。Present を呼び出すと、待ち行列が「回転」して、フロント バッファーがバック バッファー (n - 1) になり、バック バッファー 0 が新たにフロント バッファーになります。

  • D3DSWAPEFFECT_COPY
    スワップ エフェクトは、単一のバック バッファーを構成するスワップ チェーンに対してのみ指定できます。ウィンドウ スワップ チェーンの場合もフルスクリーン スワップ チェーンの場合も、ランタイムではコピーベースの Present 処理が行われるのでセマンティクスが保証されます。つまり、フリップベースの Present 処理のようにバック バッファーの内容がフロント バッファーの内容で置き換えられることはありません。 フルスクリーン スワップ チェーンの場合、ランタイムはフリップ処理とコピー処理を組み合わせて Present 処理を行います。この処理は、必要に応じて、隠しバック バッファーでサポートされます。したがって、表示はディスプレイ アダプターの垂直帰線と同期され、そのレートは選択された表示間隔によって制御されます。唯一の例外は、D3DPRESENT_INTERVAL_IMMEDIATE フラグに指定されるスワップ チェーンです。(D3DPRESENT_PARAMETERS 構造体の PresentationIntervals メンバーに関する説明を参照してください。)この場合、Present 処理は垂直帰線を待機することなく、バック バッファーの内容をフロント バッファーに直接コピーします。

  • D3DSWAPEFFECT_OVERLAY
    プライマリ サーフェスにオーバーレイ可能なビデオ メモリーの専用領域を使用します。オーバーレイの表示時にコピーは実行されません。このオーバーレイの処理は、プライマリ サーフェスのデータを変更することなく、ハードウェアで実行されます。

  • D3DSWAPEFFECT_FLIPEX
    アプリケーションでフリップ モードを使用する場合に指定します。フリップ モードの使用中は、アプリケーションをウィンドウ モードで表示している場合、アプリケーションのフレームがデスクトップ ウィンドウ マネージャー (DWM) に (コピーされるのではなく) 渡され、画面として合成されます。フリップ モードを使用したアプリケーションでは、より効率的にメモリー帯域幅を使用できるほか、全画面表示の統計情報を活用できるようになります。フリップ モードは全画面の動作には影響しません。

    Direct3D 9 と Direct3D 9Ex の違い

    D3DSWAPEFFECT_FLIPEX は、Windows 7 以降のオペレーティング システムで実行している Direct3D 9Ex でのみ使用できます。

  • D3DSWAPEFFECT_FORCE_DWORD
    コンパイル時に、この列挙型のサイズを 32 ビットにするために定義されています。この値を指定しない場合、一部のコンパイラでは列挙型を 32 ビット以外のサイズでコンパイル可能です。この定数が使用されることはありません。

解説 

Present を呼び出した後のバック バッファーの状態は各スワップ エフェクトによって明確に定義されており、Direct3D デバイスがフルスクリーン スワップ チェーンとウィンドウ スワップ チェーンのどちらで作成されたかでこの状態が変わることはありません。特に、D3DSWAPEFFECT_FLIP スワップ エフェクトはウィンドウでもフルスクリーンでも同じように動作し、Direct3D ランタイムは外部バッファーを作成することでこれを保証しています。このため、悪影響を回避できる場合には、常にアプリケーションで D3DSWAPEFFECT_DISCARD を使うことを推奨します。メモリーの消費およびパフォーマンスの点において、このスワップ エフェクトは常に最も効率的であるからです。

D3DSWAPEFFECT_FLIP または D3DSWAPEFFECT_DISCARD を使用するアプリケーションは、フルスクリーン デスティネーション アルファが機能すると期待してはなりません。つまり、これらのスワップ エフェクトを使用したフルスクリーン スワップ チェーンはドライバーの観点から明示的なピクセル フォーマットを持たないため、D3DRS_DESTBLEND レンダリング ステートが期待どおりに機能しないということです。ドライバーは、それらのスワップ チェーンが表示形式をとるべきと判断しますが、これはアルファ チャネルを持ちません。この問題に対処するには、次の手順を実行します。

  • D3DSWAPEFFECT_COPY を使用します。
  • D3DCAPS9 構造体の Caps3 メンバーの D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD フラグをチェックします。このフラグは、D3DSWAPEFFECT_FLIP または D3DSWAPEFFECT_DISCARD が使用されたときに、ドライバーがアルファ ブレンディングを行えるかどうかを示すものです。
  • フリップ モードのスワップ エフェクト (D3DSWAPEFFECT_FLIPEX) を使用しているアプリケーションでは、ウィンドウ サイズの変更後や領域の変更後に PresentEx を呼び出して、表示内容が更新されるようにする必要があります。

不可視ウィンドウではユーザー モード イベントを受け取ることができません。また、不可視の全画面ウィンドウがあると、ウィンドウ モードで実行している他のアプリケーションの表示が影響を受けます。したがって、スワップチェーンを全画面モードで表示しているときは、各アプリケーションでデバイス ウィンドウが可視状態になっている必要があります。

要件

ヘッダー: D3D9Types.h 宣言

関連項目

IDirect3DDevice9::Reset