知識ベース

複数のバッファリング

コンピュータサイエンスでは、 複数のバッファリングはデータのブロックを保持するために複数のバッファを使用するため、「リーダー」は部分的に更新されたデータではなく、完全な(おそらく古い)バージョンのデータを見ることができます「作家」によって作成されています。また、リーダーとライターが異なるデバイスである場合、デュアルポートRAM(DPRAM)を使用する必要性を回避するためにも使用されます。

説明

複数のバッファリングがどのように機能するかを説明する簡単な方法は、実際の例を使用することです。天気の良い日で、パドリングプールを外に出すことにしました。ガーデンホースが見つからないのはあなただけです。プールにバケットを入れる必要があります。そのため、蛇口からバケツ(またはバッファ)を1つ満たし、蛇口をオフにし、プールに歩いて行き、水を注ぎ、蛇口に戻って運動を繰り返します。これは、単一のバッファリングに似ています。バケツの水を「処理」している間は、蛇口をオフにする必要があります。

次に、バケットが2つある場合の実行方法を検討します。最初のバケットを埋めてから、実行中のタップの下で2番目のバケットを交換します。次に、最初のバケットをパドリングプールに空にするために、2番目のバケットが満たされるまでの時間を確保します。戻ったら、バケットを交換して、最初のバケットが再び満たされるようにします。その間に、2番目のプールを空にすることができます。これは、プールがいっぱいになるまで繰り返すことができます。バケットがいっぱいになっている間、待機して何もしない時間がはるかに短いため、この手法がプールをはるかに速く満たすことは明らかです。これはダブルバッファリングに似ています。タップは常にオンにすることができ、処理が完了するまで待つ必要はありません。

別の人を雇ってプールにバケツを運び、別の人が空になり、別の人が空になっている場合、これはトリプルバッファリングに似ています。このステップに十分な時間がかかった場合、さらに多くのバケットを使用して、タップが連続的に充填バケットを実行できるようにすることができます。

コンピューターサイエンスでは、オフにすることはできない、またはオフにするべきではない実行中のタップがある状況は一般的です(オーディオのストリームなど)。また、コンピューターは通常、ストリームではなくデータのチャンクを扱うことを好みます。このような状況では、ダブルバッファリングがよく使用されます。

ダブルバッファリングペトリネット

図のペトリネットは、ダブルバッファリングの仕組みを示しています。遷移W1とW2はそれぞれバッファー1と2への書き込みを表し、R1とR2はそれぞれバッファー1と2からの読み取りを表します。最初は、遷移W1のみが有効になっています。 W1が起動すると、R1とW2の両方が有効になり、並行して続行できます。終了すると、R2とW1が並行して進行します。

したがって、W1だけが発火する初期トランジェントの後、このシステムは周期的であり、移行は常にペアで有効になります(R1とW2、およびR2とW1)。

コンピュータグラフィックスのダブルバッファリング

コンピューターグラフィックスでは、 ダブルバッファリングは、グラフィックを描画するための手法であり、スタッター、ティアリング、およびその他のアーティファクトがまったくない(または少ない)ことを示します。

プログラムがピクセルを複数回変更しないようにディスプレイを描画することは困難です。たとえば、テキストのページを更新する場合、古い文字と新しい文字の両方にないすべてのピクセルを何らかの方法で消去するよりも、ページ全体をクリアしてから文字を描画する方がはるかに簡単です。ただし、この中間画像はユーザーにはちらつきとして見えます。さらに、コンピューターモニターは表示されているビデオページを常に再描画します(従来は1秒間に約60回)。「新しい」画像と再描画されていない「古い」画像の間の水平分割線として、完全な更新が一時的に表示されることもありますが、引き裂きとして知られています。

ソフトウェアダブルバッファリング

ダブルバッファリングのソフトウェア実装では、すべての描画操作でシステムRAMの一部の領域に結果が保存されます。そのような領域は、多くの場合「バックバッファ」と呼ばれます。すべての描画操作が完了したと見なされると、領域全体(または変更された部分のみ)がビデオRAM(「フロントバッファ」)にコピーされます。通常、このコピーは、裂けを防ぐためにモニターのラスタービームと同期されます。ダブルバッファリングのソフトウェア実装では、バックバッファに割り当てられたシステムメモリ、コピー操作の時間、同期の待機時間のために、必然的にシングルバッファリングよりも多くのメモリとCPU時間を必要とします。

合成ウィンドウマネージャは、多くの場合、「コピー」操作とウィンドウの配置に使用される「合成」を組み合わせ、スケールまたはワーピング効果でウィンドウを変換し、部分を透明にします。したがって、「フロントバッファ」には画面に表示される合成画像のみが含まれる場合がありますが、ウィンドウコンテンツ全体の非合成画像を含むウィンドウごとに異なる「バックバッファ」があります。

ページめくり

ページフリップ方式では、データをコピーする代わりに、両方のバッファーを表示できます(両方ともビデオRAMにあります)。常に、1つのバッファーがモニターにアクティブに表示され、もう1つのバッファーがバックグラウンドで描画されます。バックグラウンドバッファが完了すると、2つの役割が切り替わります。通常、ページフリップは、ビデオディスプレイコントローラーのハードウェアレジスタ(ビデオメモリ内のディスプレイデータの先頭を指すポインターの値)を変更することで実現されます。

ページフリップはデータをコピーするよりもはるかに高速で、モニターの垂直ブランキング期間(ビデオデータが描画されていない空白期間)にページが切り替えられる限り、ティアリングが見られないことを保証できます。現在アクティブで表示可能なバッファはフロントバッファと呼ばれ、バックグラウンドページは「バックバッファ」と呼ばれます。

トリプルバッファリング

コンピュータグラフィックスでは、 トリプルバッファリングはダブルバッファリングに似ていますが、パフォーマンスを改善できます。ダブルバッファリングでは、プログラムは、終了した図面がコピーまたはスワップされるまで待ってから次の図面を開始する必要があります。この待機期間は数ミリ秒であり、その間、どちらのバッファーにもアクセスできません。

トリプルバッファリングでは、プログラムに2つのバックバッファがあり、そのようなコピーに関係しないものですぐに描画を開始できます。 3番目のバッファーであるフロントバッファーは、グラフィックカードによって読み取られ、モニターに画像が表示されます。画像がモニターに送信されると、最新の完全な画像を保持しているバックバッファーでフロントバッファーが反転(またはコピー)されます。バックバッファの1つは常に完全であるため、グラフィックカードはソフトウェアの完了を待つ必要はありません。したがって、ソフトウェアとグラフィックスカードは完全に独立しており、独自のペースで実行できます。最後に、表示された画像は同期を待たずに開始されたため、遅延が最小になりました。

ソフトウェアアルゴリズムがモニターリフレッシュイベントのためにグラフィックハードウェアをポーリングする必要がないため、アルゴリズムは可能な限り高速で実行できます。これは、表示されないいくつかの図面がバックバッファに書き込まれることを意味します。 Nvidiaは、このメソッドを「高速同期」という名前で実装しています。

トリプルバッファリングと呼ばれることもある代替方法は、3バッファ長のスワップチェーンです。プログラムは両方のバックバッファーを描画した後、最初のバッファーが画面に配置されるまで待機してから、別のバックバッファーを描画します(つまり、3つの長さの先入れ先出しキューです)。ほとんどのWindowsゲームは、トリプルバッファリングを有効にするときにこのメソッドを参照しているようです。

クワッドバッファリング

クアッドバッファリングという用語は、立体実装で左右の目の画像のそれぞれにダブルバッファリングを使用することを意味します。したがって、合計4つのバッファがあります(トリプルバッファリングが使用される場合、 6つのバッファがあります)。バッファを交換またはコピーするコマンドは通常、両方のペアに一度に適用されるため、片方の目でもう一方の目よりも古い画像が表示されることはありません。

クワッドバッファリングには、グラフィックカードドライバでの特別なサポートが必要です。これは、ほとんどのコンシューマカードで無効になっています。 AMDのRadeon HD 6000シリーズ以降がサポートしています。

OpenGLやDirect3Dなどの3D標準は、クワッドバッファリングをサポートしています。

DMAのダブルバッファリング

ダブルバッファリングという用語は、ダイレクトメモリアクセス(DMA)転送のために2つのバッファ間でデータをコピーするために使用され、パフォーマンスを向上させるためではなく 、デバイスの特定のアドレス指定要件を満たすために使用されます(特に、物理的に提供されるより広いアドレス指定を持つシステム上の32ビットデバイスアドレス拡張)。MicrosoftWindowsデバイスドライバーは、「ダブルバッファリング」という用語が使用される可能性が高い場所として特に注目に値します。 LinuxおよびBSDのソースコードは、これらの「バウンスバッファー」を呼び出します。

一部のプログラマは、ゼロコピー技術を使用してこの種のダブルバッファリングを回避しようとします。

その他の用途

ダブルバッファリングは、ビデオ信号のインターレース化またはインターレース解除を容易にする手法としても使用されます。