スワップ チェーン

スワップ チェーンは、ユーザーにフレームを表示するために使用されるバッファーのコレクションです。 アプリケーションが表示する新しいフレームを提供するたびに、スワップ チェーンの最初のバッファーが、表示されているバッファーの場所を取得します。 このプロセスは、スワップまたはフリップと呼ばれます。

グラフィックス アダプターは、フロント バッファーと呼ばれる、モニター上に表示されるイメージを表すサーフェスへのポインターを保持します。 モニターが更新されると、グラフィック カードはフロント バッファーのコンテンツを表示先のモニターに送信します。 ただし、リアルタイムのグラフィックをレンダリングする場合、"テアリング" の問題が発生します。 この問題の核心は、コンピューターの他のコンポーネントと比べてモニターのリフレッシュ レートが極めて遅いということです。 一般的なリフレッシュ レートは、60 Hz (秒当たり 60 回) から 100 Hz です。

モニターのリフレッシュの最中に、アプリケーションがフロント バッファーを更新すると、表示されるイメージは半分に分かれ、ディスプレイの上半分には以前のイメージが、下半分には新しいイメージが表示されます。 この問題はテアリングと呼ばれます。

テアリングの回避

Direct3D にはテアリングを回避するための方法が 2 種類実装されています。

  • 垂直帰線 (垂直同期) 操作でモニターの更新のみを許可する方法。 通常、モニターは光ピンを水平に移動することでイメージをリフレッシュします。モニターの左上からジグザグに移動して、右下で終了します。 光ピンが一番下に到達すると、光ピンを左上に戻して、処理が再び開始されるように、光ピンを再補正します。

    この再補正は垂直同期と呼ばれます。垂直同期中は、モニターは何も描画しません。したがって、モニターが描画を再開するまで、フロント バッファーが更新されても更新は表示されません。 垂直同期は比較的処理に時間がかかりますが、待機中に複雑なシーンをレンダリングできるほどではありません。 テアリングを回避しつつ、複雑なシーンをレンダリングするには、バック バッファーリングと呼ばれる処理が必要です。

  • バック バッファーリングと呼ばれる手法を使用する方法。 バック バッファーリングとは、バック バッファーと呼ばれるオフスクリーン サーフェスにシーンを描画する処理です。 フロント バッファー以外のサーフェスは、モニターに直接表示されることがないため、オフスクリーン サーフェスと呼ばれます。

    バック バッファーを使用することで、アプリケーションはシステムがアイドル状態 (つまり、ウィンドウ メッセージが待機していない) にあるときに常にシーンをモニターのリフレッシュ レートを考慮することなく自由にレンダリングできます。 バック バッファーリングでは、バック バッファーをフロント バッファーに移動する方法とタイミングが複雑になります。

サーフェスの反転

バック バッファーをフロント バッファーに移動する処理は、サーフェスの反転と呼ばれます。 グラフィック カードでは、単純にサーフェスへのポインターを使用してフロント バッファーを表すため、ポインターを変更するだけでバック バッファーをフロント バッファーに設定できます。 アプリケーションが Direct3D にバック バッファーをフロント バッファーに表示するように要求すると、Direct3D は単純に 2 つのサーフェス ポインターを "反転" します。 これによって、バック バッファーは新しいフロント バッファーになり、古いフロント バッファーは新しいバック バッファーになります。

サーフェス フリップはアプリケーションがバック バッファーを表示するように Direct3D デバイスに要求するたびに呼び出されます。ただし、垂直同期が発生するまで要求をキューに入れるように Direct3D を設定できます。 このオプションは、Direct3D デバイスの表示間隔と呼ばれます。 アプリケーションが Direct3D でサーフェスの反転を処理する方法を指定している方法によっては、新しいバック バッファーのデータは、再利用できないことがあります。

サーフェスの反転は、マルチメディア、アニメーション、ゲーム ソフトウェアでは重要です。これはパラパラ漫画を作成する方法と同じです。 作成者は図を 1 ページずつ変えて行き、紙をすばやくめくると絵が動いているように見えます。

デバイス