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 と全画面表示の 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_SEQUENTIAL と DXGI_SWAP_EFFECT_FLIP_DISCARD のみがサポートされ、ビットモデルはサポートされていません。 このため、D3D12 ではバック バッファーのマルチサンプリングはサポートされていないため、ID3D12GraphicsCommandList::ResolveSubresource または ID3D12GraphicsCommandList1::ResolveSubresourceRegionを使用して、アプリで手動でマルチサンプリングを実行する必要があります。
DXGI_SWAP_EFFECT_SEQUENTIAL または DXGI_SWAP_EFFECT_FLIP_SEQUENTIALでマルチサンプリングを使用するには、別のレンダー ターゲットでマルチサンプリングを実行する必要があります。 たとえば、埋め込み D3D11_TEXTURE2D_DESC 構造体 (BindFlags メンバーを D3D11_BIND_RENDER_TARGET に設定し、マルチサンプリング パラメーターを持つ SampleDesc メンバーを) ID3D11Device::CreateTexture2D を呼び出して、マルチサンプリング テクスチャを作成します。 次 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_SEQUENTIAL と DXGI_SWAP_EFFECT_FLIP_DISCARD の違いは、DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL、各バック バッファーの内容が IDXGISwapChain::Present
呼び出し間で保持されることを DXGI に強制するのに対し、DXGI_SWAP_EFFECT_FLIP_DISCARD はこの保証を提供しないということです。 コンポジターは、特定のシナリオでは DirectFlip を使用できます。DirectFlip では、アプリケーションのバック バッファーをディスプレイ バック バッファー全体として使用します。これによって、アプリケーションのバック バッファーを最終的なデスクトップ バック バッファーにコピーするコストが削減されます。
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL と DXGI_SWAP_EFFECT_FLIP_DISCARDでは、この最適化は、アプリケーションが画面に表示される唯一の項目である場合に発生する可能性があります。 ただし、アプリケーションが画面に表示される唯一の項目でない場合でも、フリップ モデルが DXGI_SWAP_EFFECT_FLIP_DISCARD場合、コンポジターは、アプリケーションのバック バッファーに他のコンテンツを描画することによって、この最適化を引き続き実行できます。
SyncInterval パラメーターで 0 を指定 、フリップ モデル スワップ チェーン (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) で IDXGISwapChain1::P resent1 を呼び出すと、 IDXGISwapChain1::P resent1の動作は、Direct3D 9Ex's IDirect3DDevice9Ex::P resentExD3DSWAPEFFECT_FLIPEX および D3DPRESENT_FORCEIMMEDIATEの動作と同じです。 つまり、ランタイムは、以前にキューに入れられていたフレームの代わりに次のフレームを提示するだけでなく、以前にキューに入れたフレームに残っている残りの時間も終了します。
フリップ モデルの方が効率的かどうかに関係なく、GDI と DirectX プレゼンテーションを混在させる唯一の方法はビットレット モデルであるため、アプリケーションではビットモデルを選択できます。 フリップ モデルでは、アプリケーションは、DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLEを使用してスワップ チェーンを作成し、バック バッファー GetDC を明示的に使用する必要があります。 フリップ モデル スワップ チェーンで IDXGISwapChain1::P resent1 を最初に正常に呼び出した後、GDI はスワップ チェーンの破棄後も、そのスワップ チェーンに関連付けられている HWND で動作しなくなります。 この制限は、ScrollWindowExなどのメソッドにも適用されます。
HDR スワップチェーン バッファー形式と色空間を表示するには、フリップ モデルが必要です。 それ以外の場合は、SDR (0 ~ 1 の範囲の sRGB) で構成 (およびクリップ) されます。
フリップ モデル スワップ チェーンとプレゼンテーションの最適化の詳細については、「フリップ モデル、ダーティ四角形、およびスクロール領域を使用したプレゼンテーションの拡張を参照してください。
例
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
)
);
必要条件
要件 | 価値 |
---|---|
ヘッダー | dxgi.h |
関連項目
DXGI 列挙 の