カテゴリ:Computer & Game
新着順に並べています。時系列に読む場合は こちらからどうぞ。
キリの良い数字
前節では、デジタルRGB方式のVRAM構成の一例をお話ししました。
気が付けばメモリの容量は膨大になり、115200バイトにもなっています。
ここで、単位をキロ(K)にして115.2キロバイトと書きたいところですが、メモリの場合は1キロが1000ではなく1024ですので、115200÷1024=約113キロバイトになります。
1024という数字は、私達人間から見れば何とも切りの悪い値です。
10進法を使う私達にとっては、10の累乗で表せる値、つまり10の2乗=100、10の3乗=1000のように、十倍ずつ増えて行く値の方が切りが良く見えます。しかし、2進法を扱うコンピュータにとっては、2の累乗で表せる2、4、8、16…、のように、二倍ずつ増えて行く値の方が切りが良いのです。
1024という数値も2の累乗で表わせる値です。また、私達の世界では、例えば30や2500といった、10の累乗では表せないながらも切りが良く見える数字があります。2500は「10が250個」だと考えられますし「100が25個」や「1000が2個と100が5個」とも表わせます。
コンピュータで扱う数字の中にも、2の累乗では表わせないながらも切りの良い数字というものが存在します。例えば、768や1280は、画面の解像度を表わすときに良く出て来る数字ですが、768は2の累乗で表せる512と、その次の1024の丁度中間の値です。512に256を加えた値が768になり、1024に256を加えた値が1280になると考えても分かりやすいでしょう。
768と1280は、16進数に直すとそれぞれ300Hと500Hになります。これは、256を16進数で表わした100Hの倍数になっています。切りが良く見えるのは説明するまでもありませんね。
2006/4/14 22:44 | URI
[UP]
グラフィックVRAMはメモリを贅沢に使う
テキストVRAMの場合は、表示したい文字の文字コードを格納しておくだけで、ディスプレイコントローラが勝手にキャラクタジェネレータ(以下キャラジェネ)のフォントデータを参照しながら、電子銃のON/OFF信号を作り出しているのでした。
1文字当たり1バイトのメモリがあれば、それだけで「8×16ドットの半角文字(一例)」のグラフィックが表示できたのです。
本節では、グラフィックVRAMを使って、先程と同じ半角文字を表示してみることにします。
グラフィックVRAMは、絵のイメージをそのままメモリに格納しておくところです。ですから、テキストVRAMのときのように、キャラジェネにフォントデータを記憶させておくのではなく、直接フォントデータのON/OFF信号をVRAMに書き込んでいます。要は、例の「8×16ドット=16バイト」のデータを直接VRAMに書くのです。
グラフィックVRAMのように、画面の1ドットを表わすために個別のメモリが用意されているものを『ビットマップ』と呼んでいます。
テキストVRAMの場合は、フォントデータが格納されているキャラジェネの内容を書き換えないと、文字や絵の形を変えることはできませんでした。しかも、キャラジェネを書き換えるということは、同じ文字コードを使っている所が全部同じ形に変わってしまうのです。
しかし、ビットマップの場合は、画面の1ドットごとに対応する専用のメモリを持っているため、1ドット単位に点を描いたり消したりできます。色についても、テキストVRAMの場合は8×16ドットのフォントデータが一つの単位になっているため、文字単位でしか色を変えることができませんでしたが、ビットマップの場合は、1ドット単位に色を変えることができます。綺麗な絵を表示するためには、ビットマップでなければならないわけです。
これまで例に挙げていた80桁×30行のテキスト画面を、1ドットごとに制御するとしたら、どれくらいメモリが必要になるかを考えてみます。ドット数に直すと、横方向が80×8=640ドット、縦方向が30×16=480ドットになります。
モノクロ画像の場合は「点があるか無いか」を記憶できれば良いので、1ドットを表わすには1ビットあれば足ります。したがって、横8ドットが1バイト(8ビット)に収まりますので、80×480=38,400バイトのメモリが必要になる計算です。綺麗な絵を表示する代償として、同じ画面サイズにもかかわらず、テキストVRAMの16倍の容量が必要になるのです。
しかし、これをテレビに送るときは、テキストVRAMのように複雑な処理は行ないません。すでにメモリには、画面と同じイメージのON/OFF信号が格納されているので、キャラジェネをアクセスすることなく、そのまま同期を取りながら順番に送るだけです(下図参照)。
縦方向480ドットというのは、すでに家庭用テレビでは表示できないサイズです。表示するには、専用高解像度モニターが必要です。ここでは実在するコンピュータを例にしているわけではありませんので、解像度やメモリ容量の数値も説明用として書かれています。

モノクロ画面の場合は、上のように単純にメモリを並べておけば良いので、動作原理も分かりやすいと思います。しかし、これがカラー画面になると少々厄介になります。まず、カラー画面の中でも、最も構造が単純なデジタルRGB方式からお話ししましょう。
仮に、上のモノクロ画面のVRAMを、RGBどれかに割り当てることにします。割り当てるということは、このVRAMの出力を、3本の電子銃の何れか1本に繋ぐということです。
R信号を制御する電子銃に繋いだ場合は、このVRAMのON/OFF信号がそのまま赤色の点になります。G信号やB信号を制御する電子銃に繋いだ場合も、それぞれ同様に緑色の点、青色の点として反映されます。
この動作から考えられることは、RGBそれぞれの電子銃を制御するためのVRAMが、専用に用意されていなくてはならないということです。つまり、80×480=38,400バイトの3倍である115,200バイトのメモリが必要になるということです。
ここで3つのVRAMに、R-VRAM、G-VRAM、B-VRAMという名前を付けてみましょう。
左上端に赤い点を表示したいときは、R-VRAMの先頭アドレスに「80H」を書き、残りのVRAMの先頭アドレスには「00H」を書けば良さそうです。「80H」を書くということは、これを2進数で表現すると「10000000B」になり、左端だけが「1」になるパターンを表わすからです。
緑色の点にしたければG-VRAMのみ「80H」にして、残りを「00H」にすれば良いし、3つのVRAMに「80H」を書いた場合は、3本の電子銃に同じ信号が送られて白い点が表示されるわけです。
これが、RGBそれぞれ1ビットずつ使用するデジタルRGB方式の一例です。
各色別のVRAMの配置方法は一つではありません。RRRRR…、GGGGG…、BBBBB…のように色毎に独立した配置にする機種もあれば、RGBRGBRGB…のようにインターリーブされている場合もあります。
同じ画面サイズで表示する場合でも、テキストVRAMとグラフィックVRAM、更にモノクロかカラーかによって、VRAMの容量が大きく変わってくることがお分かり頂けたと思います。
文字の種類や大きさを変えられるコンピュータでは、フォントデータを直接グラフィックVRAMに書いています。
人間から見た場合は文字であっても、コンピュータから見た場合は、VRAMに書かれた時点で、それはもう他の絵との区別はありません。文書ファイルに元の文字コードさえあれば、後はどのような加工を施そうとも自由なのです。
2006/3/28 09:56 | URI
[UP]
綺麗な絵は、どのように記憶しているの?
VRAMには、文字コードの状態で記憶する『テキストVRAM』と、絵をそのままの状態で記憶する『グラフィックVRAM』があるのだとお話ししました。
これは、目的別にVRAMを大きく分けた場合のお話しで、前々節のキャラクタジェネレータもVRAMに含めることがありますし、最近のゲーム機のように、複雑な画面を作るための特殊な作業領域としてVRAMが使われることもあります。
VRAMと言っても用途が違うだけで、(多少特化した部分はありますが)プログラムやその他のデータを記憶するメモリと、なんら変わるものではありません。
この節からは、いままで敢えて避けてきたカラーグラフィックデータが、どのようにメモリに記憶され、テレビに送られるのかをお話ししたいと思います。
一昔前のパソコンのグラフィックと言えば、色は貧弱で画像は粗く、いかにも「コンピュータで絵を表示しています」というお粗末なものでした。しかし、最近のパソコンやゲーム機では、写真やビデオと見紛うほどの綺麗な映像が表示できるようになりました。
そもそも、色数が増えたということは、コンピュータを構成しているハードウェアの、どこがどのように変わったということなのでしょうか。なぜ昔のパソコンは色数が少なく、お粗末な映像だったのでしょうか。
その前に、色数に関するエピソードを一つご紹介しましょう。
世の中には、いったいどれほどの色が存在すると思いますか?
子供が塗り絵に使う色鉛筆やクレヨンなどは、12色や24色のセットがあれば充分楽しめるでしょう。みなさんも、この程度の色数ならば名前を言えるのではないかと思います。
パソコンが登場して何年もしないうちに、表示できる色数は512色、4096色という具合に増えて行きました。
私が、「8色しか表示できないパソコン」から、「512色表示できるようになったパソコン」に買い替えた1985年のことです。
「今度のコンピュータは、512色も表示できるようになったんだよ」
と、得意げに話をしたことがありますが、
「512色? そんなにたくさん、色の種類なんてあるのかねぇ」
という言葉が返ってきました。
普通に生活している限り、そんなにたくさんの色を「名前をつけて表現する」ことがないので仕方がないのかもしれません。しかし、自然界の色数は512色どころの騒ぎではありません。
同じ「赤」でも、光の当たり方によって無限に表現できるでしょう。イチゴの赤とリンゴの赤は違いますし、信号機の赤とも違うものです。
こう考えると家庭のテレビはすごいものです。イチゴの赤はきちんとイチゴに見えますし、リンゴの赤はリンゴに見えます。赤、緑、青、それぞれの電子銃の強さを微妙に変えるだけで、自然界の色をほぼ正確に表現しているのです。
綺麗な絵を表示できるということは、電子銃の強さを微妙に変えること、すなわち3本の電子ビームの強さを何段階で制御できるのかが鍵になりそうです。逆に言えば、昔のコンピュータは電子銃を細かく制御する機能が無かったということです。
初期のパソコンの色数は8色のものがほとんどでした。黒も含めて、青、赤、マゼンタ(紫)、緑、シアン(水色)、黄色、白の8色です。
なぜこのような色になっているのかは、光の3原色であるRGBを思い出して頂ければ簡単です。R信号のON/OFFによって得られる赤、G信号の緑、B信号の青、これらの色の組み合わせが8色になるからです。ONかOFFかのデジタルで制御するので、デジタルRGBと呼ばれることは、はじめにお話しした通りです。基本となる色が3色しかないのですから、これをデジタルで処理する場合は、組み合わせて得られる8色しか表示できないのです。
数年後には、一気に色数が増えたパソコンが登場したわけですが、この512色の表示ができるということは、いったいどういうことなのでしょうか?
8色のときはRGBそれぞれが1ビットしかなく、合計3ビットの組み合わせが8通りであることから8色になるのでした。これと同じように考えると、512通り表わせるRGBそれぞれのビット数が必要になりそうです。
この考えは正しくて、512通りの組み合わせを作るには何ビット必要なのかを考えてみると、「2の9乗=512」であることから、9ビット必要だということが分かります。RGBに振り分けると、それぞれの電子銃用に3ビットずつ使えば良いことになります。3ビットということは「000B」から「111B」の8段階、つまり、RGBそれぞれの電子銃の強さを8段階に調整して、微妙な色の表現ができるようになったということです。
2006/03/22追記
当時、512色をプログラムで扱う場合、3ビット8色×3を一度に表現するために『8進数』が使われました。

最近の『トゥルーカラー(天然色)』表示が可能なコンピュータは、1本の電子銃の強さを256段階に調節しています。単色の赤だけを見ても、暗い赤から明るい赤まで256段階の明暗が表現できるのです。
256段階を表現するには、2の8乗であることから8ビットを使わなければなりません。電子銃は3本ありますから、1ドットの点を表わすための情報量を合計すると、24ビット(3バイト)にもなります。24ビットで表せる組み合わせを計算してみると、「2の24乗(256の3乗)=1677万7216色」になります。
画像が綺麗になるのはありがたいのですが、その代償として、1ドットの点を表わすために必要なメモリ容量が増えてしまいます。モノクロ2階調画面のときは1ドット当たり1ビットで済んでいたものが、トゥルーカラーにしたとたん、24ビットものメモリが必要になってしまうのです。
この節でお話ししているビット数は、パラレルとシリアルの節で出てきたデータバスのビット数とは無関係です。データバスの幅がいくら広がっても、画面の解像度や色数には直接的には関係ありません。ただし、処理しなければならないメモリ容量が増えるため、遅いコンピュータでは無理があるということは言えます。
解像度の問題にしても、前にお話ししたドットクロックを上げるだけで水平方向の解像度は上がります。しかし、走査線1本に与えられた時間は変わらないので、解像度が上がるということは、1ドットを描くためのメモリ参照時間を速くしなければ間に合わなくなるのです。
本来、トゥルーカラー回路の方が単純で簡単なのですが、膨大なメモリを必要とするために、部品点数や価格の問題、そして、今お話ししたメモリへのアクセス速度の問題から、今まで一般のパソコンには使われませんでした。
最近になって、メモリの集積度や単価が安くなったこと、そしてコンピュータが高速になったことによって、ごく普通のパソコンでもトゥルーカラーが実現できるようになったわけです。
2006/03/22追記
この節も、1990年代に書いた文です。
2006/3/22 10:30 | URI
[UP]
いざ! 表示だ!
前節のキャラジェネのお話しと、前々節のVRAMのお話しによって、テレビに文字を表示するための材料は揃いました。いよいよ、この二つの大きな仕組みを経て、実際にテレビに表示される部分をお話ししましょう。
電子銃を制御する回路は、横方向にスライスされた「ON/OFF」信号を、電子ビームの「発射/停止」という形に忠実に反映させる部分です。横方向にスライスされた信号さえ届けば、同期信号を頼りに、画面の左上から順番に走査できるのです。
コンピュータ側のテレビ出力端子の手前には、VRAMとキャラジェネを使って、走査信号を作り出す回路があります。本稿では、この部分を『ディスプレイコントローラ』と呼ぶことにします。機種によっては、CRTC(CRTコントローラ)やGDC(グラフィック・ディスプレイ・コントローラ)、VDP(ビデオ・ディスプレイ・プロセッサ)など様々な名前が付いていますが、パソコンやワープロ、そしてゲーム機を問わず、大体同じようなことを行なっています。
ただ、仕組みが同じでも、解像度や色数によって実際の回路構成が大きく異なるため、画像処理を行なうプログラムを組むには「機種別の専門知識」が必要になる部分です。
2006/03/09追記
その後、PCのグラフィックスは、『アクセラレータ』を経て、現在ではPC、ゲーム機を問わず『GPU(グラフィックス・プロセシング・ユニット)』に進化しています(例)。そして、「機種別の専門知識」は、「ドライバ」や「高級言語から使えるグラフィックスAPI」のおかげで、ほとんど必要なくなっています。これは、メーカーやハードウェアの構成が変わっても、同じプログラムでO.K.という意味です。
時代の移り変わりによって、ますます高性能になって行く部分ですので仕方がありません。この節では、もっとも単純な『テキストVRAMを使った文字表示』に関する部分だけをお話ししています。
例えば、カーソルが左上端にあって、何も表示されていない画面に対して「ABC」という3文字のキーを押した場合、VRAMの「00H番地」に「41H」、「01H番地」に「42H」、「02H番地」に「43H」というアスキーコードが格納されます。
要は、VRAMの先頭アドレスから順番に「41H 42H 43H」と書かれるわけです。

ディスプレイコントローラの仕事は、まずVRAMの先頭アドレスに書かれているデータを読みに行きます。ここには「41H」が書かれているので、文字の形であるON/OFF信号を取り出すために、キャラジェネのメモリアドレスを計算します。この部分はディスプレイコントローラというハードウェアの仕事ですので、この計算はプログラムで行なうのではなく、簡単な電子回路の組み合わせによって求められるものです。
2006/03/09追記
PC-8001時代のCRTCでは、多少は自分のプログラムから制御することはできました(例)。
キャラジェネには、1文字当たり16(10H)バイトのフォントデータが格納されているので、41H×10H=410Hになることは先程お話しした通りです。キャラジェネのアドレスが求まると、そこから1バイト(横8ドットぶん)を取り出し、それをテレビに送ります。残りの15バイトは今は読みません。
次に、VRAMアドレスを一つ進めて「B」の文字を表す「42H」を取り出します。同様に、42H×10H=420Hから1バイトを取り出しテレビに送ります。
なぜ1バイトずつしか読まないのかは、ラスタースキャン方式であることを思い出して頂ければ良いでしょう。何度もお話ししているように、走査線は横方向に1ラインずつ電子ビームを動かして作られるからです。
このようにして画面の右端まで走査が終わると、電子ビームは瞬時に左端に戻ってきます。VRAMアドレスも、また先頭に戻ります。そして、先程と同じように「41H」というコードから「A」のキャラジェネアドレスを求め、1バイトを取り出します。
先程と違うのは、今回は2ライン目の走査線なので、取り出す位置も2バイト目になります。インターレース方式の場合は飛び越し走査をするために、1バイト目の後は3バイト目を取り出すことになります。
文字の縦サイズである16ラインぶんの走査までは以上の動作を繰り返し、それが終わるとVRAMアドレスに横方向の文字数である80を足して、2行目(17ライン目)の解析に移ります。
文にすると、なんとも面倒くさいことを一生懸命行っているように見えますが、意外と単純な動作の繰り返しによって処理されていることがお分り頂けたでしょうか。
ディスプレイコントローラは、この仕事をプログラムとは関係ないところで毎秒60回繰り返しています。プログラムからは、画面の位置に対応したVRAMに文字コードを書き込むだけで、後は勝手にハードウェアがテレビに送ってくれるわけです。
実際の回路では、もっと効率良くデータを取り出せるように、複数のラインをまとめて作って予め準備をしたり、次の節からお話しする、種類の異なるグラフィック画面を合成したり、実に様々な仕事をしている部分です。
2006/03/09追記
上の追記にも書きましたが、現在のPCやゲーム機ではGPUによって文字やグラフィックスが処理されています。これまで、ハードウェアで勝手に(しかも出来る範囲が狭い)処理されていましたが、GPUではその制限が無くなりました。プログラマのアイデア次第で、様々なグラフィックス効果をプログラミングすることができる便利なプロセッサの出現により、表現力が桁違いにアップしています。
2006/3/ 9 23:27 | URI
[UP]
文字の形を記憶しておくところ
「手引書であるVRAMを参考にする」といっても、電子銃が欲しい情報は「文字の形」をした「0」と「1」の並びであるフォントデータです。
しかし、前節でお話ししたテキストVRAMには形の情報はなく、適当に決められた文字コードという状態で書かれているだけです。一般的にはアスキーコードで格納されることもお話ししました。
フォントデータが無ければ文字が表示されるわけはありませんので、当然文字の形を記憶しておくための部品が存在します。
『キャラクタジェネレータ(キャラジェネ)』という大層な名前が付いている部品ですが、中身を見れば大したことはなく、前に登場したフォントデータを記憶しているだけのメモリです。
またメモリという名前が出てきましたが、先程のVRAMと同じように、「データの箱」が連続して並んでいることには違いありません。
VRAMやキャラジェネで使われるメモリと、プログラムを記憶するためのメモリは、番地が違うだけで同一線上に並んでいることもありますし、VRAMやキャラジェネのメモリが別の空間に並んでいるため、プログラムから直接操作できないコンピュータもあります。また、フォントデータの差し替えができないコンピュータの場合は、同じメモリでもRAMではなく、読み込み専用で電源を切っても内容が消えないROMに記憶しているタイプもあります。
同一線上に並んでいるメモリのことを「同じアドレス空間」という表現をしますが、違うアドレス空間にメモリがあって、直接操作できない場合は、間に仲介役となる特殊な部品を通して、間接的にアクセスするような構造になっています。
少し面倒な話になってきたかもしれません。
フォントデータは、すでにお話しした通り、文字の形を「0」と「1」だけで「描いた」2進数の並びです。前の例では全角文字の「A」を取り上げましたが、本節では半角文字の「A」を扱っています。
半角文字は全角文字の半分のサイズで、アスキーコードという1バイトで表せるコード体系になっています。フォントデータのサイズも半分になっています。全角文字が16×16ドットのところ、半角文字は横8ドットで表現されているからです。
ここまでお話ししていながら恐縮ですが、実は、この説明は正確ではありません。フォントのサイズには様々なものが存在するからです。
全角文字が16×16だけでなく、24×24ドットのように贅沢なサイズが用意されていて、明朝体のような綺麗な文字が表示できる機種がありますし、逆に昔のコンピュータのように漢字が表示できなかった時代には、当然半角文字しか存在せず、そのサイズも8×8ドットや5×7ドットの小さいフォントが大半を占めていました。また、最近のコンピュータの中には『アウトラインフォント』と呼ばれるデータを使って、文字の大きさやデザインを、計算によって自由に変えられるものも存在します。
しかし、サイズが変わっても、基本的な仕組みには違いはありません。ここでは「全角文字を16×16ドット(32バイト)」に「半角文字を8×16ドット(16バイト)」として、お話しを進めて行くことにします。
キャラクタジェネレータという大層な名前のメモリには、半角文字の場合、1文字当たり16バイトの2進数データが文字数ぶん連続して格納されています。並んでいる順序は、例のアスキーコード順が考えやすいでしょう。
1番目の文字のデータは0番地から15番地に格納され、2番目の文字のデータは16番地から31番地に格納されているのです。
ということは、「A」という文字のフォントデータは、アスキーコードの「41H」番目、10進数で書けば65番目ということになります。1文字は16バイトの2進数で表されていますので、65×16=1040番地から1055番地のメモリに格納されているはずです。
説明の都合上、これまでアドレスを10進数で書いてきましたが、これも普通は16進数で表記します。「A」のフォントデータが格納されている1040番地は、410H番地になります。表記する時は「Address 410H」と書くのが風習です。
書き直すと、1番目の文字は「00H」から「0FH」番地、2番目の文字は「10H」から「1FH」番地となります。[アスキーコード]×[1文字当たりのデータサイズ]という計算によって、フォントデータのアドレスは求まります。
2006/3/ 4 13:33 | URI
[UP]