次の方法で共有


レンダリング デバイスごとに複数のスワップ チェーンを使用してパフォーマンスを向上させる

パフォーマンスを向上させるために、Direct3D レンダリング デバイスごとに複数のスワップ チェーンを作成する必要がある場合があります。 この方法を使用すると、追加のデバイスを作成するために必要なメモリを節約したり、個々のデバイスごとのスワップ チェーンに個別にレンダリングするレンダリング時間を短縮したり、メモリを節約してレンダリング時間を短縮したりできます。

デバイスごとに複数のスワップ チェーンを使用するアプリ シナリオ

アプリ シーンが個別にレンダリングおよび更新される個別の表示オブジェクトで構成されている場合は、複数のチェーンを使用することを検討してください。 たとえば、ある側のビデオや別の側のスクロール可能なテキストなど、アプリは常にアニメーションを変更しています。 通常は追加のデバイスを作成する必要があるメモリを節約し、2 つのスワップ チェーン間のコンテンツの共有を容易にするために、同じ Direct3D レンダリング デバイスに関連付けられた両方のスワップ チェーンを作成できます。 アニメーションには 1 つのスワップ チェーン、テキストには 1 つのスワップ チェーンを使用します。 このシナリオの一般的な例は、 DirectComposition API も使用する Direct3D アプリです。

もう 1 つのシナリオは、複数のスワップ チェーンに複数のレンダー ターゲットを同時に設定してレンダリング時間を節約する場合です。 たとえば、トラック上のレーシング カーなど、テクスチャやジオメトリが多い複雑なシーンをレンダリングし、2 つのスワップ チェーンによってレンダリングされる 2 つの表示ウィンドウで、背面ミラーとサイド ミラーの両方からのビューをアプリ ウィンドウに表示するとします。 複数のスワップ チェーンをレンダー ターゲットとして設定した場合、アプリは各スワップ チェーンでレンダリング時間を個別に繰り返す必要はありません。

デバイスごとに複数のスワップ チェーンを管理する

このセクションのガイドラインを使用して、1 つの Direct3D レンダリング デバイス用に作成する複数のスワップ チェーンを管理します。

フレームの最大待機時間の設定

IDXGIDevice1::SetMaximumFrameLatency メソッドを使用して、オペレーティング システムがディスプレイにレンダリングするためにキューに登録できる現在の操作の最大数を設定します。 この最大数は、スワップ チェーンごとではなく、Direct3D レンダリング デバイスごとに行われます。 したがって、オペレーティング システムが目的の vsync 間隔で現在の操作を表示するようにするため、デバイスごとに複数のフリップまたはビットブル モデル スワップ チェーンを作成する場合、およびフレームごとに複数のスワップ チェーンがレンダリングされる場合は、最大フレーム待機時間を 1 に設定しないことをお勧めします。 一般的なルールとして、同じデバイスのすべてのスワップ チェーン間でフレームあたり 2 つの存在操作のみを確実に送信する場合は、最大フレーム待機時間を 2 に設定できます。 フレームごとに現在の操作を確実に送信してカウントできない場合は、 present 統計 を使用して、オペレーティング システムに現在の操作が表示されるタイミングを追跡できます。

デバイスごとに複数のスワップ チェーンでフリップ モデルを使用する

1 つの Direct3D レンダリング デバイス用に作成する複数のスワップ チェーンを持つ DXGI フリップ モデル を使用する場合は、次のガイドラインを使用します。

各スワップ チェーンの現在の操作を使用した特定の vsync 間隔のターゲット設定

デバイスごとに 2 つ以上のフリップ モデル スワップ チェーンを作成する場合は、デバイスの状態のシーケンスと、すべてのスワップ チェーンの IDXGISwapChain1::P resent1 メソッドの呼び出しのシーケンスを管理する場合の表示の違いに注意してください。 オペレーティング システムで、意図した vsync 間隔で各スワップ チェーンの現在の操作が表示されるようにするには、キューに登録された現在の操作の数が、バック バッファーの数が最も少ないスワップ チェーンのバック バッファーの数よりも常に少なくとも 1 つ少ないことを確認することをお勧めします。

2 つのバッファーを使用してモデル スワップ チェーンを反転する

キューに登録された現在の操作の数がバック バッファーの数 (1) 以下の場合、アプリは特定の vsync 間隔をターゲットにすることができます。 また、各スワップ チェーンを個別に使用またはレンダリングしてから、現在の操作で各スワップ チェーンの使用を終了する必要があります。 そのため、2 バッファー フリップモデル スワップ チェーンに対するすべての現在の操作を送信すると、バック バッファーの数のしきい値に達します。ここで、アプリで特定の vsync 間隔をターゲットにする場合は、特別な注意を払う必要があります。

2 バッファー スワップ チェーンの場合、特定の vsync 間隔をターゲットにするには、オペレーティング システムが各スワップ チェーンの現在の操作の表示を完了してから、次のバッファーにレンダリングする必要があります。 別のスワップ チェーンに対して同じ操作を行う前に、レンダー ターゲット ビューとその他のレンダリング状態の設定を完了してから、1 つのスワップ チェーンの 2 つのバッファーごとに IDXGISwapChain1::P resent1 を呼び出することをお勧めします。 2 つ以上のスワップ チェーンを操作する場合は、各スワップ チェーンのデバイスでレンダー ターゲットとレンダリング状態をリセットする必要があります。 この方法の利点は、スワップ チェーンの現在の操作の 1 つ以上が意図した vsync 間隔を逃す場合を回避することです。 最初の例では、「 デバイスごとに複数のスワップ チェーンを使用するアプリ シナリオ」で説明されているように、アニメーションとテキストを変更するアプリでは、特定の現在の間隔をターゲットにすることで、アニメーションが 1 つの表示ウィンドウで更新されると、別のスワップ チェーンによってレンダリングされる対応するテキストも別の表示ウィンドウに同時に表示されます。 アプリで特定の vsync 間隔をターゲットにする必要がある場合は、このガイダンスに従う必要があります。

この図は、それぞれ 2 つのバッファーを持つ 2 つのフリップ モデル スワップ チェーンを持つアプリでのスワップ チェーンレンダリングとプレゼンテーションのコード フローの例を示しています。 この場合、現在の操作ごとに特定の現在の間隔をターゲットにする必要があります。

2 つのバッファーを持つフリップ モデルの図

複数のスワップ チェーンをレンダー ターゲットとして同時に設定することでレンダリング時間を短縮する

2 番目の例では、「 デバイスごとに複数のスワップ チェーンを使用するアプリ シナリオ」で説明されているように、トラック上のレーシング カーでは、すべてのスワップ チェーンに複数のレンダー ターゲットを同時に設定することで得られるレンダリング時間の節約と、特定の現在の vsync 間隔をターゲットにトレードオフすることができます。 この場合は、複数のレンダー ターゲットを同時に設定し、各スワップ チェーンでシーンをレンダリングしてから、シーンで使用される各スワップ チェーンで IDXGISwapChain1::P resent1 を呼び出します。 この方法の利点は、レンダリング時間を短縮することです。 この方法の制限は、2 バッファー スワップ チェーンを使用する場合、スワップ チェーンの現在の同時操作で同じ vsync をターゲットにできないことです。 たとえば、同じ内容がレース カーのリア ビュー ミラーから表示された後、オペレーティング システムは、1 vsync までレース カーのサイド ビュー ミラーの内容を表示しません。

この図は、長さが 2 つのバッファーを持つ 2 つのフリップ モデル スワップ チェーンを持つアプリでのスワップ チェーンレンダリングとプレゼンテーションのコード フローの例を示しています。 この種類の例では、バッファー A と C のチェーン 1 と 2 をスワップするためにレンダリング時間を節約します。ただし、バッファー A と C の現在の操作が表示される vsync 間隔を同期することはできません。 このパターンは、フレーム 2 に対して繰り返されます。

複数のスワップ チェーンをレンダー ターゲットとして同時に設定する図

キューに登録された多数の現在の操作のために、目的の vsync 間隔が欠落しないようにするには、各スワップ チェーン内のバック バッファーの数を増やします。 ただし、この手法では、より多くのビデオ メモリが使用されます。 ターゲット vsync 間隔が欠落しないようにするには、キューに入っている現在の操作の数を、スワップ チェーン内のバック バッファーの数よりも少なくし、バック バッファーの数を最小限に抑えておくことをお勧めします。 2 つのスワップ チェーンを複数のレンダー ターゲットとして設定する場合、両方のスワップ チェーンで 2 つの存在する操作を同時にキューに入れますので、少なくとも 3 つのバッファーの長さのスワップ チェーンを作成することをお勧めします。

次の図は、長さが 3 つのバッファーを持つ 2 つのフリップ モデル スワップ チェーンを持つアプリでのスワップ チェーンレンダリングとプレゼンテーションのコード フローの例を示しています。 ここでは、任意の特定のフレームに対するキューに登録された存在の数が 2 であるため、これはスワップ チェーンあたりのバック バッファーの数より少ないため、アプリは複数のレンダー ターゲットを設定し、フレーム 2 のバッファー A と D と後続のフレームのバッファーに対して同じ vsync 間隔をターゲットにすることができます。

同じ vsync をターゲットとするレンダー ターゲットとして複数のスワップ チェーンを同時に設定する図

反転モデル、ダーティ四角形、スクロール領域を使用したプレゼンテーションの強化