

フレームバッファ(フレームバッファ、またはフレームストアとも呼ばれる)は、ビデオディスプレイを駆動するビットマップを含むランダムアクセスメモリ(RAM)[ 1 ]の一部です。これは、完全なビデオフレーム内のすべてのピクセルを表すデータを含むメモリバッファです。[ 2 ]最新のビデオカードは、コアにフレームバッファ回路を搭載しています。この回路は、メモリ内のビットマップをコンピュータモニターに表示できるビデオ信号に変換するのに役立ちます。
コンピューティングにおいて、スクリーンバッファとは、コンピュータアプリケーションがコンピュータディスプレイに表示されるコンテンツを表現するために使用するコンピュータメモリの一部です。[ 3 ]スクリーンバッファは、ビデオバッファ、再生バッファ、または略して再生バッファとも呼ばれます。 [ 4 ] 「スクリーンバッファ」という用語は論理機能を指し、ビデオメモリはハードウェアの記憶場所を指します。具体的には、スクリーンバッファはメインRAM、ビデオメモリ、またはその他のハードウェアの場所に配置される場合があります。
遅延を減らし、画面のティアリングを回避するために、複数のフレームをバッファリングすることができます。この手法はマルチバッファリングと呼ばれます。この場合、常に1つのフレームのみが表示され、他のフレームは表示されません。現在表示されていないフレームは、オフスクリーンバッファに格納されています。
バッファ内の情報は通常、ディスプレイに表示される各ピクセルの色値で構成されます。色値は一般的に、1ビットバイナリ(モノクロ)、4ビットパレット、8ビットパレット、16ビットハイカラー、および24ビットトゥルーカラーの形式で格納されます。ピクセルの透明度に関する情報を保持するために、追加のアルファチャンネルが使用される場合もあります。フレームバッファに必要なメモリの総量は、出力信号の解像度と色深度またはパレットサイズによって異なります。

コンピュータ研究者たちはフレームバッファの理論的な利点について長年議論してきたが、経済的に実現可能なコストで十分なメモリを備えたマシンを製造することはできなかった。 [ 5 ] 1947年、マンチェスターベビーコンピュータはウィリアムズ管(後にウィリアムズ・キルバーン管)を使用して陰極線管(CRT)メモリに1024ビットを保存し、2番目のCRTに表示した。[ 6 ] [ 7 ]他の研究室もこれらの技術を研究しており、MITリンカーン研究所は1950年に4096の表示を実現した。[ 5 ]
1960年代後半には、ドラムメモリとテレビモニターを使用したBrookhaven RAster Display (BRAD)と呼ばれるカラー走査ディスプレイが実装されました。 [ 8 ] 1969年、ベル電話研究所のA.マイケル・ノールは、磁気コアメモリを使用してフレームバッファを備えた走査ディスプレイを実装しました。[ 9 ] 約1年後、ベル研究所のシステムは、標準的なカラーテレビモニターに3ビットの色深度で画像を表示できるように拡張されました。コンピュータで使用されていたベクターグラフィックスは、テレビディスプレイの走査グラフィックス用に変換する必要がありました。
1970年代初頭、MOSメモリ(金属酸化膜半導体メモリ)集積回路チップ、特に少なくとも1kbのメモリを持つ高密度DRAM(ダイナミックランダムアクセスメモリ)チップの開発により、標準的なビデオ画像を保持できるフレームバッファを備えたデジタルメモリシステムを初めて作成することが実用的になった。 [ 10 ] [ 11 ]これにより、 1972年にゼロックスPARCのリチャード・ショープによってSuperPaintシステムが開発された。 [ 10 ]ショープはSuperPaintフレームバッファを使用して、初期のデジタルビデオキャプチャシステムを作成することができた。出力信号を入力信号に同期させることで、ショープはシフトインする各ピクセルのデータを上書きすることができた。ショープはまた、カラーテーブルを使用して出力信号を変更する実験も行った。これらのカラーテーブルにより、SuperPaintシステムは、保持する限られた8ビットデータの範囲外のさまざまな色を生成することができた。この方式は後にコンピュータのフレームバッファで一般的になるだろう。
1974年、エバンス&サザーランド社は、約15,000ドルで最初の商用フレームバッファであるピクチャーシステム[ 12 ]を発売しました。これは、8ビットグレースケールで最大512×512ピクセルの解像度を生成することができ、独自のフレームバッファを構築するリソースを持たないグラフィックス研究者にとって大きな恩恵となりました。ニューヨーク工科大学は後に、エバンス&サザーランド社のフレームバッファ3台を使用して最初の24ビットカラーシステムを作成しました[ 13 ] 。各フレームバッファはRGBカラー出力(赤、緑、青それぞれ1つずつ)に接続され、デジタル機器コーポレーションのPDP 11/04ミニコンピュータが3つのデバイスを1つとして制御しました。
1975年、英国のクアンテル社は、初の商用フルカラー放送用フレームバッファであるクアンテルDFS 3000を開発した。これは1976年のモントリオールオリンピックのテレビ中継で初めて使用され、競技場に入場するランナーの映像に、聖火トーチのピクチャー・イン・ピクチャー映像を映し出すために用いられた。
集積回路技術の急速な進歩により、1970年代後半の多くの家庭用コンピュータには、低色深度のフレームバッファが搭載されるようになった。今日では、グラフィック機能を備えたほぼすべてのコンピュータが、ビデオ信号の生成にフレームバッファを使用している。1980年代に開発されたAmigaコンピュータは、グラフィック性能に特に重点を置いた設計が特徴で、4096色を表示できる独自のホールド・アンド・モディファイ・フレームバッファを搭載していた。
フレームバッファは、 1980年代を通じてハイエンドワークステーションやアーケードシステム基板でも普及しました。SGI 、Sun Microsystems、HP、DEC、IBMはいずれもこの時期にワークステーションコンピュータ向けにフレームバッファをリリースしました。これらのフレームバッファは、ほとんどの家庭用コンピュータに搭載されているものよりもはるかに高品質で、テレビ、印刷、コンピュータモデリング、3Dグラフィックスなどで広く使用されました。セガもハイエンドアーケード基板にフレームバッファを使用しており、こちらも家庭用コンピュータのものより高品質でした。

パーソナルコンピュータや家庭用コンピュータで使用されるフレームバッファには、多くの場合、動作モードが定義されており、そのモードに応じて異なる解像度、色深度、メモリレイアウト、リフレッシュレートのタイミングが出力されます。
Unix系マシンやオペレーティングシステムの世界では、こうした便利な機能は敬遠され、ハードウェア設定を直接操作することが好まれていた。この操作ははるかに柔軟性が高く、フレームバッファに割り当てられるメモリ容量によってのみ制限されるものの、あらゆる解像度、色深度、リフレッシュレートを実現できた。
この方法の残念な副作用は、ディスプレイ デバイスがその能力を超えて駆動される可能性があることでした。場合によっては、ディスプレイのハードウェアが損傷しました。[ 14 ]より一般的には、単に文字化けして使用できない出力が生成されました。最新の CRT モニターは、保護回路を導入することでこの問題を解決しています。表示モードが変更されると、モニターは新しいリフレッシュ周波数で信号ロックを取得しようとします。モニターが信号ロックを取得できない場合、または信号が設計上の制限範囲外である場合、モニターはフレームバッファ信号を無視し、ユーザーにエラー メッセージを表示する可能性があります。
LCDモニターには、同様の保護回路が搭載されていることが多いが、その理由は異なる。LCDは表示信号をデジタル的にサンプリングする必要があるため(つまり、電子ビームを模倣するため)、範囲外の信号は物理的にモニター上に表示できない。
フレームバッファは従来、さまざまなカラーモードをサポートしてきました。メモリコストが高かったため、初期のフレームバッファのほとんどは、1ビット(ピクセルあたり2色)、2ビット(4色)、4ビット(16色)、または8ビット(256色)の色深度を使用していました。このような小さな色深度の問題点は、フルレンジの色を表現できないことです。この問題を解決するために開発されたのがインデックスカラーで、フレームバッファにルックアップテーブルを追加します。フレームバッファメモリに格納されている各色は、カラーインデックスとして機能します。ルックアップテーブルは、限られた数の異なる色を持つパレットとして機能し、残りの部分はインデックステーブルとして使用されます。
以下は、典型的なインデックス付き256色画像とそのカラーパレット(スウォッチの長方形として表示)です。
一部のデザインでは、ルックアップテーブルにデータを書き込んだり(または既存のパレットを切り替えたり)して、画像を水平方向に分割し、それぞれに独自のパレットを持たせることで、より幅広い色域を持つ画像をレンダリングすることも可能でした。例えば、屋外で撮影した写真の場合、画像を4つのバーに分割できます。一番上のバーは空の色調、次のバーは葉の色調、その次は肌や衣服の色調、そして一番下のバーは地面の色調です。この方法では、各パレットに重複する色を持たせる必要がありましたが、慎重に行えば、非常に高い柔軟性を実現できました。
フレームバッファへのアクセスは一般的にCPUメモリ空間への直接マッピングを介して行われますが、これが唯一のアクセス方法ではありません。フレームバッファのメモリアクセス方法は多岐にわたります。最も一般的な方法には以下のようなものがあります。
フレームバッファの構成は、ピクセル単位でパックされる場合と、平面単位でパックされる場合があります。フレームバッファは、すべてのポイントにアドレス指定できる場合と、更新方法に制限がある場合があります。
ビデオカードには必ず一定量のRAMが搭載されています。このRAMのごく一部は、画像データのビットマップを表示のために「バッファリング」する場所です。そのため、このRAMを指す際に「フレームバッファ」という用語がしばしば同義語として用いられます。
CPUは画像更新をビデオカードに送信します。カード上のビデオプロセッサは画面イメージの画像を作成し、それをRAM内の大きなビットマップとしてフレームバッファに格納します。RAM内のビットマップは、カードによって画面イメージを継続的に更新するために使用されます。[ 15 ]
多くのシステムは、互換性の理由から、フレームバッファデバイスの機能をエミュレートしようと試みています。最も一般的な仮想フレームバッファは、Linuxフレームバッファデバイス(fbdev)とX仮想フレームバッファ(Xvfb)です。Xvfbは、グラフィカルフレームバッファなしでXを実行する方法を提供するために、 X Window Systemディストリビューションに追加されました。Linuxフレームバッファデバイスは、基盤となるフレームバッファにアクセスするための物理的な方法を、プログラムが容易にアクセスできる保証されたメモリマップに抽象化するために開発されました。これにより、プログラムは、メモリマップが分離しているシステムやバンク切り替えを必要とするシステムに対処する必要がなくなるため、移植性が向上します。
フレームバッファは、2フレーム分のビデオデータを格納できる十分なメモリ容量を持つように設計できます。一般的にダブルバッファリング、より具体的にはページフリッピングと呼ばれる手法では、フレームバッファはそのメモリの半分を使って現在のフレームを表示します。そのメモリが表示されている間、残りの半分は次のフレームのデータで埋められます。セカンダリバッファがいっぱいになると、フレームバッファはセカンダリバッファを表示するように指示されます。プライマリバッファがセカンダリバッファになり、セカンダリバッファがプライマリバッファになります。この切り替えは、古いフレームの半分と新しいフレームの半分が同時に表示される画面のティアリングを防ぐために、垂直ブランキング期間の後に行われることがよくあります。
ページめくりは、PCゲームプログラマーが使用する標準的な技術となっている。
グラフィックス性能向上への需要が高まるにつれ、ハードウェアメーカーはフレームバッファへのデータ書き込みに必要なCPU時間を短縮する方法を開発しました。これは一般的にグラフィックスアクセラレーションと呼ばれています。一般的なグラフィックス描画コマンド(その多くは幾何学的描画)は、そのままの形式でグラフィックスアクセラレータに送信されます。アクセラレータは、コマンドの結果をフレームバッファにラスタライズします。この方法により、CPUは他の処理に専念できるようになります。
初期のアクセラレータは、2D GUIシステムのパフォーマンス向上に重点を置いていました。2D 機能は維持しつつも、最新のアクセラレータのほとんどは、リアルタイムでの 3D 画像の生成に重点を置いています。一般的な設計では、 OpenGLやDirect3Dなどのグラフィックス ライブラリを使用し、グラフィックス ドライバと連携して、受信したコマンドをアクセラレータのグラフィックス処理ユニット(GPU) の命令に変換します。GPU はこれらの命令を使用してラスタライズされた結果を計算し、その結果をフレームバッファにビット ブロットします。フレームバッファの信号は、内蔵のビデオ オーバーレイ デバイス (通常はフレームバッファのデータを変更せずにマウス ポインタを生成するために使用) と、出力信号を変更することによって生成される最終的な特殊効果と組み合わせて生成されます。このような最終的な特殊効果の一例として、3dfx Voodooカードで使用されている空間アンチエイリアシング技術があります。これらのカードは出力信号にわずかなぼかしを加えることで、ラスタライズされたグラフィックスのエイリアシングをはるかに目立たなくします。
かつては、3dfx Interactive、ATI、 Hercules、Trident、 Nvidia、Radius、S3 Graphics、SiS、Silicon Graphicsなど、多くのグラフィックスアクセラレータメーカーが存在した。 2015年現在x86ベースのシステム向けグラフィックスアクセラレータ市場は、Nvidia(2002年に3dfxを買収)、AMD(2006年にATIを買収)、およびIntelによって支配されている。
フレームバッファを使用する場合、(ディスプレイ技術がフレームバッファを採用している場合)電子ビームは、テレビが放送信号をレンダリングするのと同じように、ラスタースキャンを実行するように指令されます。このようにして画面上に表示される各点の色情報は、スキャン中にフレームバッファから直接取得され、一連の離散的な画像要素、すなわちピクセルが生成されます。
フレームバッファは、ラスターグラフィックス(ひいてはフレームバッファの概念)の登場以前に一般的だったベクターディスプレイとは大きく異なります。ベクターディスプレイでは、グラフィックスプリミティブの頂点のみが格納されます。出力ディスプレイの電子ビームは、これらの頂点間の領域を横切る線をトレースするように、頂点から頂点へと移動するように指令されます。
同様に、フレームバッファは、バッファが個々のピクセルではなく文字のコードを保持する初期のテキストモードディスプレイで使用されていた技術とは異なります。ビデオディスプレイ装置は、フレームバッファの場合と同じラスタスキャンを実行しますが、ビームの方向を制御する際に、バッファ内の各文字のピクセルを生成します。