この記事は、参照 からの続編です。
この記事は、絵でわかる プログラムとは何か(5)~データ~ の一記事です。
この記事のポイント
- コンピューターで扱う文字種(グリフ)の1つ1つには、文字コードが割り当てられている。
- ディスプレイには、小さな小さなランプ(画素)がたくさん並べられている。
- それら画素の明るさを順番に指定したデータをビットマップと言う。
- ビットマップデータで指定する順番どおりに、画素の明るさを調整していく動作のことを走査と言う。
- 1画面分の走査、あるいは1画面分のビットマップデータを1フレームと言う。
- 文字入力や画面出力など、様々なプログラムで共通する処理はOSが行う。
- フォントデータなどを表示すべき位置に合成するグラフィックス処理をレンダリングと言う。
- レンダリングは、GPUなど専用のグラフィックス処理回路で処理される。
文字情報(text)
アセンブリ言語が作られて、マシンコードではなくニーモニックをコンピューターで扱えるようになりました。しかし、ON/OFFパターンしか入力できなかったはずのコンピューターは、どうやってニーモニックを読めるようになったのでしょうか?
文字コードとグリフ
その答えは、「文字コード」というアイディアにあります。コンピューターで使う文字種1つ1つに数値のコードを割り当てたのです。例えば、
- 記号の”!”という文字には、
- 00100001 (10進数の33)
- アラビア数字の”1″という文字には、
- 00110001 (10進数の49)
- アルファベットの”A”という文字には、
- 01000001 (10進数の65)
- アルファベットの”a”という文字には、
- 01100001 (10進数の97)
この “!” や “1” や “A” や “a” のように、1つの文字コードに対応した1つの文字種をグリフ(glyph)と言います。
グリフと似た言葉に『字体』、『字形』があります。ここで説明したグリフは『字体』と同じ意味です。旧字体/新字体という言葉からも『字体』の意味は想像しやすいでしょう。それに対して、グリフを『字形』としている説明もあります。『字形』は、『字体』に付けられた装飾(書体)も含めて「文字の見た目」を表す言葉です。欧米文化の glyph の語源が「判読され得るシンボル」というような意味なので、装飾を含まない『字体』の方が近い感じはしますが、それを『字形』とした慣用が、日本の印刷業界で定着したのかもしれません。
同じグリフには毎回同じ文字コード、異なるグリフには異なる文字コードとなるように、グリフと文字コードとの対応表が作られました。(ASCIIコード表など)
つまり、コンピューターは相変わらず2進数の数値しか処理できないままでも、文字コードという2進数をコンピューターに扱わせることで、文字も数値と同様に扱えるようにしたのです。そして文字コードは、人間が関わる時だけ、文字として見えるように機械的に変換されます。
では、実際に人間が関わる、文字の入出力はどうなっているのでしょうか? 以下では、人間が操作するキーボードによる文字入力と、人間が文字を見るディスプレイ出力について、見ていきます。
キーボード入力
キーボードのしくみは簡単です。キートップ(キーボードのキーの上面)には、 “A” や “1” などの文字が描かれていますが、コンピューターにしてみれば、そこに何が描かれているかは読めませんし、関係がありません。
ただ、キーボードが
- “A” のキーを押すと、 01100001 の信号をコンピューターに送る
- “1” のキーを押すと、 00110001 の信号をコンピューターに送る
- “Shift” キーを押しながら “A” のキーを押すと、 01000001 の信号をコンピューターに送る
- “Shift” キーを押しながら “1” のキーを押すと、 00100001 の信号をコンピューターに送る
というように、キートップのグリフに対応した文字コードを送るようにさえなっていれば、人間の思い通りの文字コードをコンピューターに入力できるのです。
ディスプレイ出力
ディスプレイは、キーボードよりもだいぶ高度です。もっとも単純化したディスプレイであるランプから、少しずつ高度化していき、現在の標準的なディスプレイになるまでを見てみましょう。
ランプ
ランプは点灯/消灯の2状態が基本です。これは、1 と 0 のビット情報に対応付けられます。
電卓の液晶画面
次に、いくつかのランプを並べて見ましょう。横一列に8個並べれば、8ビット=1バイトの情報を表示できます。これを横一列ではなく、日の字型に配置した7本の太線の点灯/消灯で一桁の数字を表すのが、単純な電卓の液晶画面です。
画像表示ディスプレイ
ランプを縦横にたくさん並べれば、白黒の画像を表示することもできます。たくさん並べると場所を取るので、1個1個のランプを小さく小さくします。縦横に並んだ小さな小さなランプ(画素、ピクセルまたはドットと言います)が、縦100個×横100個、全部で1万個くらいになると、そこそこ簡単な画像を表現できます。
なお、1万個の全ランプを一度に点灯/消灯させようとすると、配線も1万セットくらい必要になってしまいます。これはかなりの設備投資です…
走査型ディスプレイ
しかし、一度に点灯/消灯するのはあきらめて、制御器で順番に1個1個、点灯/消灯させていくようにすれば、配線は1セットで済みます。
このように順番にランプを操作していく方式を走査(raster scan)と言います。走査順は通常、英文の文字の並びと同じ順(横書き式)になっています。それは、以下のような順番です。
- まず左上が出発地点となり、そこから右へ順番に、右端まで。この一行が一本の走査線になります。
- 走査線の右端まで来たら、一行下の左端へ移り、そこからまた右へ…と何本も何本も、一番下の走査線まで走査を繰り返します。
この走査順に合わせて、順番どおりに点灯/消灯の情報を並べた画像データを、ビットマップ(bitmap)と言います。文字通り、一連のビット(bit)情報を、平面に配置(map)していましたね。これは電話線一本で画像を送るFAXの基本動作でもあります。
高精細ディスプレイ
単純な点灯/消灯だけでなく、明るさの度合い(輝度)も細かく指定できれば、より精細に画像を表現できます。
また、白色ランプの点灯/消灯では、白黒の画像しか表現できませんが、3原色の小さな小さなランプを縦横均等に並べて、各ランプの輝度調整をすれば、カラーの画像も表現できます。
こうしてハードウェアとしてのディスプレイの進化に合わせて、ビットマップデータにも輝度や色合いの情報が加えられ、より高精細な画像を記録・表現できるようになりました。
動画再生ディスプレイ
では、ディスプレイはどのくらいの速さで画面を走査しているのでしょうか?仮に画面全体の走査に数秒もかかっていれば、目でその動きを確認できるでしょう。しかし、0.01秒レベルの速さになると、人間の目には画面全体が一度に表示されているように錯覚されます。この1画面分の全走査データを1フレームと言います。(「額縁」と同じ英語の frame です)
何フレームもの画像を高速に連続して再生させれば、パラパラ漫画や映画フィルムのように、動画になります。こうしてフレームデータを連続してつなげたものが、動画の映像データになります。
なお、1画面分の走査データであるフレームとは別に、フレームデータを受け、表示するディスプレイ側での1画面分の走査を表す用語として、リフレッシュという言葉もあります。
フレームもリフレッシュも、1秒間に何回、全画面走査されるかで、性能指標となり得ます。
それぞれ、フレームレート[単位: fps]、リフレッシュレート[単位: Hz]と言い、数値が大きいほど、滑らかな映像を映し出せます。
現在は、フレームレートは、30fps (1フレーム約0.033秒)程度、リフレッシュレートは、60Hz が標準になっています。
インターレースとプログレッシブ
映像データを1フレームずつ送らずに、1走査線飛ばしの半フレーム、つまり 奇数番走査線の半フレーム/偶数番走査線の半フレーム を交互に送る方式をインターレース(interlace)方式と言います。インターレースにすることで、データ送信速度が遅い場合でも、滑らかな動きに見せられる場合があります。
1走査線飛ばしのインターレースに対して、全走査線を飛ばさず毎回順番通りに走査する方式をプログレッシブ(progressive)方式と言います。十分なデータ送信速度があれば、プログレッシブの方が、高画質になります。
OSでの処理
キーボード入力のしくみより、キーボードの “A” を打てば、コンピューターに 01000001 が入力され、メモリへ新たに 01000001 が記録されます。こうした「入力受付からメモリ記録まで」のような、様々なプログラムで共通して行われる処理は、OSで行われます。
同様に、「メモリに記録された文字コードを、ディスプレイに表示する処理」も、様々なプログラムで共通して行われる処理なので、OSに任されます。
OSと入出力装置の間を仲介し、その入出力装置独自の機能に対応するソフトウェアを、デバイスドライバーと言います。
デバイスドライバーは、その入出力装置メーカーから特別に提供される場合には、OSと別物として扱われます。
一方、キーボードやディスプレイのように単純な機能しかない機器の場合、OSの一部で、多くの機器共通の入出力機能にだけ対応した汎用デバイスドライバーが使われます。
例えば、文字 “A” をディスプレイ画面に表示する場合、OSは以下のように動きます。
0. あらかじめ、各グリフ用の画像データ(フォントデータ)をメモリにロードしておく。
- 文字コード 01000001 と、その文字を表示するべき位置(カーソル位置等)の情報を受け取る。
- 文字コード 01000001 に対応するグリフ “A” のフォントデータと、その表示位置情報をグラフィックス処理回路へ送る。
- グラフィックス処理回路で、このグリフ “A” のフォントデータを、基になるフレームデータ内のあるべき位置に合成し、ディスプレイに送るフレームデータを完成させる。(レンダリング)
- 完成したフレームデータの前後をつなぎ、連続した映像データとしてディスプレイに送る。
こうして、ディスプレイ画面のあるべき位置に “A” の文字が映し出されます。
なお、グラフィックス処理回路とは、CPU内にある論理回路の一種で、パイプライン(多重並列配線)により、フレームデータの合成など、レンダリングを効率的に行える専用回路のことです。また、CPUとは別に、GPU(Graphics Processing Unit)というグラフィックス専用プロセッサをコンピューターに搭載する場合もあります。
この記事のまとめ
コンピューターで扱う文字種(グリフ)の1つ1つには、文字コードが割り当てられています。
ディスプレイには、小さな小さなランプ(画素)がたくさん並べられており、それら画素の明るさを指定したビットマップデータを、順番どおりに画素に適用していく動作のことを走査と言います。
1画面分の走査、あるいは1画面分のビットマップデータを1フレームと言います。
文字入力や画面出力など、様々なプログラムで共通する処理はOSが行います。
フォントデータなどを表示すべき位置に合成するグラフィックス処理をレンダリングと言い、レンダリングは、OSから必要なデータを受け、GPUなどのグラフィックス処理回路で処理されます。
次は、映像・音声 に進みましょう。
この記事は、絵でわかる プログラムとは何か(5)~データ~ の一記事です。
コンピューターのしくみ全体を理解したい場合は、以下の2コースがお勧めです。
日本全国 オンラインレッスン にも対応しています。
知りたいことだけ単発で聞きたい場合は、 オンラインサポート をご利用ください。