VRAM

VRAM （ブイラム, Video RAM）は、コンピュータなどにおける、ディスプレイに対するビデオ（動画像）表示部分のメモリ（記憶装置）として使われるRAM。グラフィックスメモリまたはビデオメモリとも呼ばれる。専用のデュアルポートのものもあれば、メインメモリと同じDRAMやSRAMを利用したものもある。かつて、グラフィックス用フレームバッファ（Framebuffer）のために用意したメモリをG-RAMと表記していた時期もあるが、意味としては等価である。GPU上で汎用計算を行なうGPGPUが普及してからは、グラフィックス用途に限らないデータの処理用途にも転用されている。 通常のDRAMをVRAMとして使用する場合、グラフィックコントローラ (CRTC、VDPなど) とCPUが同時にVRAMにアクセスすることによる競合を避ける必要がある。この解決策としてグラフィックコントローラがバスの空きをチェックして競合を避けるサイクルスチールという技法が使われた。また、CPUとグラフィックコントローラで同時にアクセス可能なデュアルポートRAMと呼ばれるメモリがVRAMとして使われることもあった。このデュアルポートRAMがVRAMとして広く使われた時代があったためか[独自研究?]、本来の言葉の意味からすると誤用ではあるが、動画像処理用途ではなくともデュアルポートRAMのことをVRAMと呼ぶ用例が過去には多くみられた[要出典]。広義のデュアルポートRAMとしては1995年にサムスン電子が開発したWRAM (Window RAM) がある。WRAMはデュアルポート構成なだけでなく、チップ上に描画向けの簡単な演算機能を持っており、描画の高速化に一役買っていた。WRAMはMatrox MillenniumやMillennium IIで採用されたが、それ以後はデュアルポートRAMは主流ではなくなっている。 2000年台以降ではVRAMの高速化が進み、GDDRと呼ばれる高速処理専用のメモリ規格が登場。3次元コンピュータグラフィックス描画における莫大なデータの高速転送を実現している。主な規格として、GDDR3、GDDR4、GDDR5などがビデオカードに搭載されている。GDDR系統とは別に、根本的なブレイクスルーとなるTB/secの帯域幅を実現するメモリ規格であるHBM (High Bandwidth Memory) が考案され、2015年6月にリリースされたAMD Radeon R9 Fury XにHBM第1世代が世界で初めて搭載された。一方で、GDDR5の後継規格として、技術的に従来の延長線上にあるGDDR5Xや、GDDR6も考案されている。コストパフォーマンスの観点から、オフィス用途ではDDR3などのDDR系統が、ゲーム用途ではGDDR系統が主に用いられている一方、高性能だが高価なHBMはプロフェッショナルグラフィックス用途やHPC用途（特に人工知能の研究開発で顕著）を中心に利用されている。 その主な用途はレンダリングした画面を走査するまでのバッファであるが、レンダリングに際して用いる頂点データやテクスチャなどの素材をバッファリングしたりするなど、中間の処理にも用いられる。これらの構成は各機種のアーキテクチャによって大きく異なる。 VRAMを用いたシステムのメモリ空間は、主記憶装置と同じアドレス空間を持つ場合と、グラフィックコントローラが独立したアドレス空間を持つ場合がある。 VRAMにカラーピクセル(画素)を配置する方法としては、カラーコードのビットごとに配置するプレーンドアクセス方式（フレームアクセス方式/水平型VRAM）、カラーコードのバイトごとに配置するパックドピクセル方式（ビットマップ方式/垂直型VRAM）、キャラクタ単位で配置するキャラクタグラフィック、プログラマブル・キャラクタ・ジェネレータなどがある。 VRAMの用途のひとつに、レンダリングに用いる素材のバッファリングがある。設計や用途にも依存するが、レンダリングに際してはグラフィックコントローラーからこれら素材に対して頻繁にアクセスする場合が多く、VRAMの重要な用途のひとつとなっている。なお、近代的なグラフィックスデバイスでは必ずしも用途（メモリタイプ）ごとに専用のハードウェアメモリ領域があるというわけではなく、後述するレンダリングバッファ・ランダムアクセスバッファを含め、物理的には均等なハードウェアメモリ領域を必要に応じて切り出して、ドライバーレベルで用途別（読み取り専用／書き込み専用／読み書き両用）に最適化したアクセス方法がなされることになる。 コンピュータにおけるRAMの容量が小さかった時代では、文字のグリフのような高度なグラフィックスデータをそのまま保持しておくことは困難だった。そこで初期のコンピュータでは、キャラクタ（文字）のみの描写に特化したテキスト（文章）画面を持っていた。これは画面上に表示する文字のキャラクタコードのみをVRAMに記憶し、走査時にCRTコントローラがVRAMの値を元にあらかじめキャラクタジェネレータROM内に用意されたフォントデータを文字として展開するものである。 国産機種の場合、CG-ROM内には、ASCIIコードに含まれる英数字の他、空き部分には、カタカナ、記号等が割り当てられ、記号は機種によって異なったほか、平仮名のフォントを持っている機種も存在した。通常、書き込む値は、ASCIIコードと一致していたが、MZ-80シリーズと、その後継機はディスプレイコードという特殊な並びのデータを書き込むようになっており、テキストモードしか持たない同機では、キャラクタコードの一部を4×4のピクセルに見立て、その組み合わせである空白を除いた15個のパターンを割り当て、80×50ピクセルのビットマップパターンとして見立てる様になっており、擬似的に超低解像度のビットマップを実現していた。広告では「セミグラフィック」と記述されている。 テキストVRAMには、その文字の属性、色等を示すアトリビュートエリアが文字そのもの以外の領域として多くの機種が持っていた。グラフィックスプレーンを兼用する場合は、その場所のデータをどう扱うかというものや、純粋にテキスト用のエリアであっても、複数の文字単位ないし、文字単位で、文字色、背景色、ブリンク、キャラクタテーブルの指定等を行えるようになっていた。これらの構造は、ハードウェア的にキャラクタディスプレイの機能を持たない機種であっても、サブプロセッサ領域内に相当する領域が設けられており、少ないデータによって文字列を処理することを可能にしていた。 また、キャラクタジェネレータROMは、単色、256パターンのフォントを書き込まれたROMであることが多かったが、この部分をRAMにし、物によっては、カラーでデータを持てるようにしたものが、PCGである。ワープロや、一部機種の外字、ゲーム機のBG画面のパターン等も同様の機能と利便性を提供する。 これらの実装では、1文字に付き、文字種の指定が1バイトとなっており、空白を含め、256種しか取り扱えず、英語圏では有用ではあったものの、日本語の文字情報を取り扱うには仕様として不足していた。そこで、テキストVRAMのテキストを取り扱う部分自体を拡張した、漢字テキストVRAMをハードウェア的に持つようになった機種も生まれた。8ビット機では、X1turbo、MZ-2500。16ビット機ではPC-9801シリーズがこれらの仕組みを持っており、グラフィックスプレーンにソフトウェア的に処理するよりも格段に早く、快適な日本語のテキスト処理を可能としていた。 その後、ハードウェアの進化に伴い、日本語処理もソフトウェア的に処理するDOS/Vや、文字の座標が不定であるGUIなど、速度的に問題がなくなったり、ハードウェアによって表示座標や文字種、フォントが固定されることが問題になる実装が出てくると、ハードウェアによるテキスト処理は見られなくなっていった。ゲーム機などにおけるタイルパターン等の実装も、ポリゴンとテクスチャマッピングを基準とした構造のハードウェアが増えるにつれ、前述のような構成・機能を持つことは無くなった。 2019年5月現在のPCでもPOST画面等、最低限のシステムで文字情報が表示できるよう、同じ手順で文字を表示する仕組みを備えている。 ポリゴンにテクスチャマッピングを施す際、その素材となるテクスチャのデータを格納するための領域である。 画像の高精細化にともない、テクスチャのデータも大容量化の傾向にあるため、近年[いつ?]のGPUなどはテクスチャバッファに対してデータを自動的に圧縮格納してVRAMを節約する機能を持っていることが多い（例：S3TCやASTC（英語版）など）。 画面上へポリゴンを重ね合わせる際に、その優先順位を決定するための深度情報およびその格納領域がZバッファである。概念についての詳細は該当項目を参照のこと。 初期のポリゴン描画システムでは、Zソートという簡易的な方式を用いていた。これはポリゴン1枚ごとに深度情報（Zインデックス）を持たせるものだが、ポリゴン同士が絡み合うように配置された場合には描画結果が意図されたような重ね合わせにならない場合があった。Zバッファはこれを改め、ピクセルごとに深度情報を持たせたものである。比較的正確な表示が可能になった一方、情報量や処理負荷は増大したため、GPUの近傍にデータの格納領域が必要となった。 その他、マスク情報を格納するステンシルバッファがあり、ステンシルバッファを活用することで描画領域のクリッピングなどを行なうことができる。Zバッファとステンシルバッファは1つの領域にまとめて格納・管理されることもある 。 ポリゴンの各頂点の位置情報や色情報などを配列形式でビデオメモリに格納しておき、レンダリングする際に高速参照できるようにするのが頂点バッファである。 また、レンダリングの際に頂点バッファ（頂点配列）中の特定のインデックスを指定して、プリミティブを構成するためのデータを参照することがしばしば行なわれるが、そのインデックス配列を格納するのがインデックスバッファである。 さらに、ワールド座標空間で定義されたポリゴンを画面座標に変換する際に必要となる変換行列、ポリゴン単位やメッシュオブジェクト単位の材質情報、あるいは光源（ライト）の色や減衰係数といった特性情報を格納するのが定数バッファ（定数レジスタ）である。プログラマブルシェーダーが導入されたDirectX 8以降では、定数バッファ（定数レジスタ）の用途やレイアウトはアプリケーションプログラマーが明示的に制御する。DirectX 9.0cまでは、頂点シェーダーの定数レジスタ数が256あるいはそれ以上、ピクセルシェーダーの定数レジスタ数が最大224と制限されていたが、DirectX 10以降では定数バッファ（定数レジスタ）が14スロット×4096ベクトルに拡張されるなど、制限が大幅に緩和されている。なお、DirectX 11.1以降ではさらに定数バッファのサイズ制限が緩和されている 。 レンダリングにかかる時間は、描画の内容やハードウェアの構成によって大きく異なる一方、画面の走査は特定のタイミングでおこなわれる。レンダリングされた画像（レンダリングの過程も含まれる場合がある）を走査するまでの間保持しておくメモリがレンダリングバッファである。 小容量の時代であっても高度なグラフィックスを描く方法が工夫されていた。それは走査線1本分のみのグラフィックデータを保持するラインバッファである。これは低価格のハードウェアで高速に描画する必要のあったゲーム機などに多用された。スプライト、スクロール面、BG面などの画面情報を読み出し、それをVDPが走査線ごとにレンダリングしていた。 走査線1本分のみのデータなので容量が少なくても済む一方、レンダリングのタイミングが厳しく、処理が間に合わないとスプライトなどの表示が欠けてしまう場合がしばしば見られた。 これもRAMの大容量化にともない消えていった。 画面の1フレーム分をまるごとバッファリングするもの。 汎用性の求められるコンピュータでは、画面の表示欠けが許されないとされる場合が多かった。これを解決するために、画面1フレームをまるごとバッファリングすることのできるフレームバッファが多くの機種で採用された。描画処理の時間や順序に多少の融通ができるため、レンダリング処理が間に合わない事態を防ぐ効果がある。ただし能力の限界を超えて描画しようとすると、ラインバッファと同様に表示欠けを生じたり、見た目のフレームレートが低下（いわゆる処理落ち）したりする。 初期のパソコンでも中級機以上のものはフレームバッファに似たグラフィックVRAMを保有していた。現代から見れば色数が少なかったもののVRAMの使用量は比較的多く、それらがゲーム機やホビーパソコンなどに比べて非常に高価な理由のひとつとなった。 ゲーム機でも、RAMの容量価格比が増大するとフレームバッファが使われるようになり、本格的な3D描画が可能となった。 高いフレームレートでちらつきのない高度なレンダリングをおこなうため、しばしばダブルバッファという方式が採られる。これはフレームバッファを2フレーム分用意し、片方がレンダリングの結果を出力している間、もう片方にレンダリングを重ねていくものである。原理上表示欠けは発生しないが、レンダリングに時間がかかると処理落ちを生じてしまう。高度なグラフィックスをリアルタイムで動かすゲームのCGにとって重要な技術だが、VRAMを大量に消費するためゲーム機では容量が不足しやすいといったジレンマがある。PlayStation 2ではこの対策として、インターレース画面の1フレームを2フィールドに分け、片方のフィールドを走査する間にもう片方のフィールドにレンダリングするという、簡易的なダブルバッファを用いることが多い。この場合プログレッシブ走査が不可能となり、そのためPS2ではプログレッシブ走査に対応したソフトが少ない。 レンダリング結果を画面に表示することなく一時的に保存して、同一フレーム内で素材として再利用する場合、書き込み可能な一時テクスチャバッファ（レンダーターゲット）へのレンダリングを行なうといった手法が従来から採用されてきた。DirectX 9では、同一フォーマットの複数レンダーターゲットに対して同時にレンダリングを行なう、マルチレンダーターゲットが標準化された。 しかし、GPUを汎用計算に利用するGPGPUでは、出力先には制限・制約の多いテクスチャではなく、ランダムアクセス（任意インデックスによる読み書き）が可能なバッファのほうが都合がよい。GPGPUのためのAPIとして開発・策定された、NVIDIA CUDA、OpenCL、DirectComputeでは、それぞれランダムアクセス可能なバッファが標準化されている。 VRAMはその用途から高速性が求められるため、しばしば通常のRAMとは異なる工夫がなされる。 VRAMの主用途はバッファであるため、入力用のバスと出力用のバスを独立させることによってスループットを改善させたものである。半導体素子が持つ能力の割に高速な処理が可能となるが、I/O回路が複雑となるため通常のRAMよりも割高である。 かつてはVRAMといえばデュアルポートRAMが主流だったが、低コストの機種ではデュアルポートRAMを採用しないものも多かった。近年[いつ?]SDRAMなどシングルポートRAMの高速化技術が発展するとデュアルポートRAMの衰退は顕著となり、現在[いつ?]ではGDDR3、GDDR4、GDDR5といった高速シングルポートRAMにとって代わられている。 描画を走査に間に合わせる必要があることから、VRAMは通常のワークRAM（メインメモリ）よりも高速なものを用いることが多いが、その分素子が高価となる。しかし全てのシステムが高速な描画を要求されているわけではなく、PCのオンチップグラフィックスなど安価で描画能力を重視しないシステムでは、専用のVRAMを持たずにメインメモリから間借りする場合が多い。このように、メインメモリの領域から他用途のメモリを間借りすることをUMA（ユニファイドメモリアーキテクチャ）という。 またUMAには、高速処理が必要な部分だけに高価な素子を用い、比較的低速でも構わない部分はメインメモリに間借りするといった方法もある。その代表例としてAGPが挙げられる。これは高速性を求められるフレームバッファのみをビデオカードに実装し、その他のメモリをCPUのワークエリアから間借りして、GPUとの間を専用のバスで繋ぐものである。 逆に、描画密度の割に画素数の少ないシステムでは、テクスチャバッファなどへ専用VRAMを充当しつつ、フレームバッファのほうをUMAでまかなってしまうといった場合も存在する。 なお、Xbox 360のように、システムメモリとビデオメモリはUMAとして共有するものの、フレームバッファ専用に小容量だが高速なeDRAMを備えるアーキテクチャも存在する。 近年[いつ?]ではPlayStation 4に見られるように[疑問点 – ノート]hUMAとして、CPUとGPUでメモリマップを統合させている例もある。