DXGI_SWAP_EFFECT列挙 (dxgi.h)

IDXGISwapChain1::P resent1 を呼び出した後の表示サーフェイスのピクセルを処理するためのオプション。

構文

typedef enum DXGI_SWAP_EFFECT {
  DXGI_SWAP_EFFECT_DISCARD = 0,
  DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
  DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3,
  DXGI_SWAP_EFFECT_FLIP_DISCARD = 4
} ;

定数

 
DXGI_SWAP_EFFECT_DISCARD
値: 0
このフラグを使用して、ビット ブロック転送 (bitblt) モデルを指定し、 IDXGISwapChain1::P resent1 を呼び出した後に DXGI がバック バッファーの内容を破棄するように指定します。
このフラグは、複数のバック バッファーを持つスワップ チェーンに対して有効ですが、アプリケーションはバッファー 0 への読み取りおよび書き込みアクセス権のみを持ちます。
このフラグを使用して、ディスプレイ ドライバーがスワップ チェーンの最も効率的なプレゼンテーション手法を選択できるようにします。

Direct3D 12: この列挙値はサポートされていません。 D3D12 アプリでは 、DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL または DXGI_SWAP_EFFECT_FLIP_DISCARDを使用する必要があります。

メモ 全画面表示排他と全画面表示 UWP には違いがあります。 Windows PC 上の UWP に Direct3D 11 アプリケーションを移植する場合は、スワップ チェーンを作成するときに DXGI_SWAP_EFFECT_DISCARD を使用する場合に注意してください。
UWP では Win32 と同じように動作せず、その使用は GPU のパフォーマンスに悪影響を与える可能性があります。

これは、UWP アプリケーションが FLIP スワップ モード (他のスワップ モードが設定されている場合でも) に強制されるためです。
以前の bitblt モデルによって最初に実行されたメモリ コピーで使用される時間。

DX11 破棄スワップ チェーンを手動で変換し、可能な場合はDXGI_SWAP_EFFECT_DISCARDの代わりに DXGI_SWAP_EFFECT_FLIP_DISCARD を使用して、UWP 内でフリップ モデル 使用することをお勧めします。
詳細については、以下の例を参照し、 この記事 を参照してください。

 
DXGI_SWAP_EFFECT_SEQUENTIAL
値: 1
このフラグを使用して、bitblt モデルを指定し、 IDXGISwapChain1::P resent1 を呼び出した後に DXGI がバック バッファーの内容を保持するように指定します。
最初のバッファー (バッファー 0) から最後のバッファーまでの順番でスワップ チェーンの内容を表示するには、このオプションを使用します。
このフラグはマルチサンプリングでは使用できません。

Direct3D 12: この列挙値はサポートされていません。 D3D12 アプリでは 、DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL または DXGI_SWAP_EFFECT_FLIP_DISCARDを使用する必要があります。


メモ 最適なパフォーマンスを得る場合は、 DXGI_SWAP_EFFECT_SEQUENTIALではなくDXGI_SWAP_EFFECT_FLIP_SEQUENTIAL を使用 します。 詳細については、この記事を参照してください。

 
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
値: 3
このフラグを使用して、反転プレゼンテーション モデルを指定し、 IDXGISwapChain1::P resent1 を呼び出した後に DXGI がバック バッファーの内容を保持するように指定します。 このフラグはマルチサンプリングでは使用できません。


Direct3D 11: この列挙値は、Windows 8 以降でサポートされています。
DXGI_SWAP_EFFECT_FLIP_DISCARD
値: 4
このフラグを使用して、反転プレゼンテーション モデルを指定し、 IDXGISwapChain1::P resent1 を呼び出した後に DXGI がバック バッファーの内容を破棄するように指定します。
このフラグは、マルチサンプリングおよび部分プレゼンテーションでは使用できません。
DXGI 1.4 の機能強化に関するページを参照してください。


Direct3D 11: この列挙値は、Windows 10 以降でサポートされています。
このフラグは、複数のバック バッファーを持つスワップ チェーンに対して有効です。ただし、アプリケーションはバッファー 0 に対してのみ読み取りと書き込みのアクセス権を持っています。


メモ Windows ストア アプリでは 、DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL または DXGI_SWAP_EFFECT_FLIP_DISCARDを使用する必要があります。

 

注釈

この列挙は、 DXGI_SWAP_CHAIN_DESC および DXGI_SWAP_CHAIN_DESC1 構造体によって使用されます。

D3D12 では、 DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARD のみがサポートされ、ビットブル モデルはサポートされていません。 このため、D3D12 ではバック バッファーのマルチサンプリングはサポートされていないため、 ID3D12GraphicsCommandList::ResolveSubresource または ID3D12GraphicsCommandList1::ResolveSubresourceRegion を使用して、アプリで手動でマルチサンプリングを実行する必要があります。

DXGI_SWAP_EFFECT_SEQUENTIALまたはDXGI_SWAP_EFFECT_FLIP_SEQUENTIALでマルチサンプリングを使用するには、別のレンダー ターゲットでマルチサンプリングを実行する必要があります。 たとえば、埋め込みD3D11_TEXTURE2D_DESC構造体を使用して ID3D11Device::CreateTexture2D を呼び出してマルチサンプリング テクスチャを作成します (BindFlags メンバーはD3D11_BIND_RENDER_TARGETに設定され、SampleDesc メンバーはマルチサンプリング パラメーターを使用します)。 次 に ID3D11Device::CreateRenderTargetView を呼び出して、テクスチャのレンダー ターゲット ビューを作成し、シーンをテクスチャにレンダリングします。 最後に ID3D11DeviceContext::ResolveSubresource を呼び出して、マルチサンプリングされていないスワップ チェーンにマルチサンプリング テクスチャを解決します。

プレゼンテーション モデル間の主な違いは、コンポジションのためにバックバッファー コンテンツをデスクトップ ウィンドウ マネージャー (DWM) に取得する方法です。 DXGI_SWAP_EFFECT_DISCARD値とDXGI_SWAP_EFFECT_SEQUENTIAL値と共に使用される bitblt モデルでは、IDXGISwapChain1::P resent1 の呼び出しごとに、バック バッファーの内容がリダイレクト画面にコピーされます。 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL値と共に使用されるフリップ モデルでは、すべてのバック バッファーが DWM と共有されます。 したがって、DWM は、追加のコピー操作を行わずに、それらのバック バッファーから直接作成できます。 一般に、フリップ モデルの方が効率的なモデルです。 フリップ モデルには、現在の統計の拡張など、より多くの機能も用意されています。

DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARDの違いは、DXGI_SWAP_EFFECT_FLIP_SEQUENTIALが DXGI に対して、各バック バッファーの内容が呼び出し間でIDXGISwapChain::Present保持されることを保証する必要があるのに対し、DXGI_SWAP_EFFECT_FLIP_DISCARDはこの保証を提供しないということです。 コンポジターは、特定のシナリオでは DirectFlip を使用できます。DirectFlip では、アプリケーションのバック バッファーをディスプレイ バック バッファー全体として使用します。これにより、アプリケーションのバック バッファーを最終的なデスクトップ バック バッファーにコピーするコストが削減されます。 DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARDでは、この最適化は、アプリケーションが画面に表示される唯一の項目である場合に発生する可能性があります。 ただし、画面に表示される項目がアプリケーション以外の場合でも、フリップ モデルが DXGI_SWAP_EFFECT_FLIP_DISCARD場合、コンポジターは、アプリケーションのバック バッファーに他のコンテンツを描画することで、この最適化を実行できます。

SyncInterval パラメーターで 0 が指定されたフリップ モデル スワップ チェーン (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) で IDXGISwapChain1::P resent1 を呼び出すと、IDXGISwapChain1::P resent1 の動作は、Direct3D 9ExIDirect3DDevice9Ex::P resentEx と同じであり、D3DSWAPEFFECT_FLIPEXD3DPRESENT_FORCEIMMEDIATE。 つまり、ランタイムは、以前にキューに入れられていたフレームではなく、次のフレームを表示するだけでなく、以前にキューに入れたフレームに残っている残りの時間も終了します。

フリップ モデルの方が効率的かどうかに関係なく、GDI と DirectX プレゼンテーションを混在させる唯一の方法はビットレット モデルであるため、アプリケーションでビットレット モデルを選択できます。 フリップ モデルでは、アプリケーションは 、DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLEを使用してスワップ チェーンを作成し、その後、バック バッファーで GetDC を明示的に使用する必要があります。 フリップ モデル スワップ チェーンで IDXGISwapChain1::P resent1 が最初に正常に呼び出された後、GDI は、スワップ チェーンの破棄後でも、そのスワップ チェーンに関連付けられている HWND で動作しなくなります。 この制限は、 ScrollWindowEx などのメソッドにも及びます。

フリップ モデル スワップ チェーンとプレゼンテーションの最適化の詳細については、「反転モデルを使用したプレゼンテーションの拡張」、「四角形のダーティ」、「スクロール領域」を参照してください。

UWP でスワップ チェーンを作成するには、DX11 テンプレートの新しいインスタンスを作成し、D3D12 サンプルの のDeviceResources::CreateWindowSizeDependentResources実装を確認するだけで済みます。

DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};

       swapChainDesc.Width = lround(m_d3dRenderTargetSize.Width);    // Match the size of the window.
       swapChainDesc.Height = lround(m_d3dRenderTargetSize.Height);
       swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;            // This is the most common swap chain format.
       swapChainDesc.Stereo = false;
       swapChainDesc.SampleDesc.Count = 1;                           // Don't use multi-sampling.
       swapChainDesc.SampleDesc.Quality = 0;
       swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
       swapChainDesc.BufferCount = 2;                                // Use double-buffering to minimize latency.
       swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;     // All Windows Store apps must use a flip effect.
       swapChainDesc.Flags = 2048;
       swapChainDesc.Scaling = scaling;
       swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;

       // This sequence obtains the DXGI factory that was used to create the Direct3D device above.
       ComPtr<IDXGIDevice3> dxgiDevice;
       DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice));

       ComPtr<IDXGIAdapter> dxgiAdapter;
       DX::ThrowIfFailed(dxgiDevice->GetAdapter(&dxgiAdapter));

       ComPtr<IDXGIFactory4> dxgiFactory;
       DX::ThrowIfFailed(dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)));

       ComPtr<IDXGISwapChain1> swapChain;
       DX::ThrowIfFailed(
              dxgiFactory->CreateSwapChainForCoreWindow(
                     m_d3dDevice.Get(),
                     reinterpret_cast<IUnknown*>(m_window.Get()),
                     &swapChainDesc,
                     nullptr,
                     &swapChain
                     )
              );

要件

要件
Header dxgi.h

こちらもご覧ください

DXGI 列挙

最適なパフォーマンスを得るための DXGI フリップ モデルを使用する