スワップ チェーン
スワップ チェーンは、バック バッファーのローテーションを制御し、グラフィックス アニメーションの基礎となります。
概要
Direct3D 12のスワップ チェーンのプログラミング モデルは、以前のバージョンの D3D と同じではありません。 たとえば、D3D10 および D3D11 に存在していたリソースの自動ローテーションをサポートするプログラミングの利便性は、サポートされなくなりました。 レンダリングされる実際のサーフェスによって各フレームが変更される一方で、自動リソース ローテーションにより、アプリで同じ API オブジェクトをレンダリングできました。 スワップ チェーンの動作は、Direct3D 12で変更され、Direct3D 12の他の機能で CPU オーバーヘッドが少なくなります。 自動カラー キーとマルチサンプリングはサポートされていませんが、特にストレッチと回転は引き続きサポートされています。
バッファーの有効期間
アプリで、バック バッファーを参照する事前作成の記述子を保存できます。スワップ チェーンが所有する一連のバッファーが、スワップ チェーンの有効期間中に変更されないようにすることで、これを行うことができます。 IDXGISwapChain::GetBuffer によって返されるバッファーのセットは、特定の API が呼び出されるまで変更されません。
GetBuffer で返されるバッファーの順序は変更されません。
IDXGISwapChain3::GetCurrentBackBufferIndex によって、現在のバック バッファーのインデックスがアプリに返されます。
スワップ効果
サポートされているスワップ効果は 、DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL と DXGI_SWAP_EFFECT_FLIP_DISCARDのみです。バッファー数が 1 より大きい必要があります。
ウィンドウ モードと全画面表示モード間の切り替え
Direct3D 12では、全画面表示排他モード (FSE) はサポートされていません。 代わりに、ゲームが画面上で表示される唯一のアプリケーションである場合、OS は全画面表示最適化 (FSO) と呼ばれる戦略を使用して、パフォーマンスの欠点なしに FSE と同様の効果を実現します。 FSO の詳細については、「全画面表示最適化 の解明」を参照してください。
Direct3D 12は、ウィンドウモードと全画面表示モードの間を切り替えた後にアプリケーションが ResizeBuffers を呼び出す必要がある制限を維持します (D3D11 フリップモデルスワップチェーンには同じ制限があります)。
IDXGISwapChain::SetFullscreenState の切り替えでは、スワップ チェーンの一連のアプリ認識バッファーは変更されません。 ResizeBuffers および ResizeTarget 呼び出しでのみ、アプリ認識バッファーが作成または破棄されます。 ただし、Direct3D 12 IDXGISwapChain::SetFullscreenState では、全画面表示の排他モードは開始せず、解像度と更新レートを変更するだけで全画面表示の最適化が可能になります。 これらの変更は、このメソッドを使用せずにアプリによって行うことができます
または IDXGISwapChain::P resent または IDXGISwapChain1::P resent が呼び出されると、表示されるバック バッファーは D3D12_RESOURCE_STATE_PRESENT 状態である必要があります。 これが該当しない場合、 present はDXGI_ERROR_INVALID_CALL で失敗します。
全画面表示のスワップ チェーンには、スワップ チェーンの最終リリース前に SetFullscreenState(FALSE, NULL) を呼び出さなければならないという制限が引き続きあります。 setFullscreenState(FALSE) は、Direct3D 12 デバイスで実行されているスワップ チェーンで成功します。
現在の操作は、スワップチェーンの作成時に提供される 3D キューで実行され、アプリは複数のスワップ チェーンを同時に表示したり、コマンド リストを記録および実行したりできます。
グラフィックスの最後の部分 (フレーム後処理など) がコンピューティング キューで行われた場合、またはデバイスのグラフィックス キューが含まれていない場合は、表示する 2 番目の 3D キューを作成すると、有益であり、プレゼンテーションの待機時間が次のフレームの開始を遅らせるのを防ぐことができます。
例
メインのレンダリング ループに存在するコードの例を次に示します。
void Present()
{
m_swapChain->Present(0, m_presentFlags);
m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}
スワップ チェーンの作成
CreateSwapChainForHwnd、CreateSwapChainForCoreWindow または CreateSwapChainForComposition 呼び出しを使用する場合、pDevice パラメーターには、デバイスではなく、Direct3D 12 の直接コマンド キューへのポインターが実際に必要になるので注意してください。
Windows 7 でのプレゼンテーション
Windows 7 でDirect3D 12を対象とする場合、Direct3D 12に必要な DXGI の種類は存在しないため、表示するには D3D12On7 提供の ID3D12CommandQueueDownLevel (直接コマンド キューからクエリを実行) を使用する必要があります。
開いているコマンド リストを Windows 7 present メソッドに提供すると、そのコマンドが使用され、閉じられ、デバイスに自動的に送信されます。 アプリで作成する必要があり、コミットされたリソースである必要があり、単一サンプリングである必要があり、次のいずれかの形式である必要があるバック バッファーを指定する必要があります。
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R10G10B10A2_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_B8G8R8X8_UNORM
- DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB