2ntブログ

コンピュータで絵を動かす難しさ大変さ

つい最近、Youtubeでファミコン時代の技術的に優れた作品集みたいなのを見たので。

この動画で私もかつて述べた事がある、昔のスクウェアに居た外国人の天才プログラマーによる、ファミコンの限界を超えまくった高速全画面スクロールの話が出ていた。

ファミコンに限らず、コンピュータで画像を動かすのは、非常に難しくて大変なのだ。
今のパソコンやスマホだって、CPUの計算処理能力とプログラムだけで、動画を再生させたら、カクカクになるだろう。
そうならないのは、画像を動かす機能を持ったグラフィック専用の処理をするCPUみたいなのが組み込まれているからだ。
これをビデオカードと言ったり、グラフィック・チップとか言ったりする。

さて、コンピュータの画像というのは、「ドット」と呼ばれる小さな四角い点の集まりで出来ているのは知っているかと思う。
だから昔のゲームとかは、キャラクターとか文字がカクカクしてるのだ。
現在のパソコンやスマホでも、目を画面に近づけてよーく見てみてれば、■の集まりで絵や文字が出来ているのが分かる。
昔のコンピュータの画像のように、カクカクした線に見えないのは、単に■の大きさが昔よりも小さくなって、カクカクが目立たなくなっただけに過ぎない。

このコンピュータの■(ドット)は、その中にさらに「光の三原色」と言われる赤・緑・青の色が付いた、めっちゃ小さな電球みたいなのが入っている。
だから「R/G/B」と言われるのだ。

これがそれぞれ、どのぐらいの明るさで光るかによって、水彩絵の具を混ぜて色を作るのと同じように、三色以外の色になるのだ。
絵の具と違うのは、三原色の種類だけでなく、混ぜ具合による効果が逆になる事もあげられる。
絵の具というのは、色んな色を大量に混ぜ合わせると「黒」になる。
光の場合は色んな色を大量に混ぜ合わせる=全ての色のランプをめっちゃ光らせると、「白」になるのだ。
そして、色を混ぜ合わせないか、めっちゃ薄く混ぜる、ほとんど水みたいな状態だと絵の具は「透明」になり、画用紙の色である「白」になるわけだが、光の場合は何も光ってない状態というのは、真っ暗であり「黒」である。

話が逸れたが、コンピュータで文字や絵を画面に表示する場合、どこの■(ドット)をどんな色で光らせるか、全て指定してやらなければならない。
1ドットにつき、赤・緑・青のランプをどの程度光らせるかを、全てのドットに指定しなければならない。
今のパソコンの標準的な画面の大きさであるHD画像というのは、1920×1080個の■がある。
この1画面のドット数が縦・横それぞれ何個並んでいるかで、画面の細かさを示すコンピュータの用語を「解像度」と言う。

人間が、同じ数の□で構成された方眼紙に、色つきの点を打っていくだけでも大変なのは分かると思うが、CPUにプログラムでそれをやらせるのも、いかに大変か分かると思う。

静止画を表示するだけでも、これだけ大変なのに、さらにそれを動かすとなると、もっと大変なのは分かるだろう。
ゲームのキャラクターを動かすにしろ、画面全体が常に変化する動画を表示させるにしろ、それらはただでさえ大変な、ドットを使ってコンピュータの画面に絵を表示するという作業を、1秒未満の単位で何度も素早く行わなければならないのだ。
動画の原理はいまさら言うまでもないと思うが、内容が少しづつ違う画像を、素早く連続で人間の目に見せる事によって、あたかも絵が動いているかのようにするわけだ。
パラパラ漫画は、だれしも学生時代に教科書の端とかに書いて暇つぶしに遊んだ覚えがあると思うが、それと同じだ。

コンピュータのゲームや動画などで、その性能を示す基準に「FPS」というものがあるが、この「FPS」とは1秒間に何枚の異なる画像が表示できるか、と同じ意味である。
この数値が大きいほど、人の目には滑らかに動く画面に見え、少ないと「カクカク」した動きに見えてしまう。

画面全体が常に変化する、アニメーションや映画などのようなものは、それでもまだ簡単な方なのだ。
あらかじめ用意されている、何百枚・何万枚もの「絵」のデータを、素早くビデオ・メモリという場所に転送していけば良いだけなので。
しかしながらゲームの画像はそうはいかない。
プレイヤーの操作や、乱数によって決定される敵の動きなどによって、表示しなければならない「絵」が無限に変化するからだ。
あらかじめ用意しておく事など、とても出来ない。

そして、ゲームの場合は動かないか、動きが少ない背景の上に、それらのキャラクター達を重ねて表示する必要がある。
よって、コンピュータでゲームのキャラクターを動かす場合は、まず背景を書いて、その後にキャラクターが居る場所に、再度キャラクターの絵を「上書き」する作業が必要となる。
コンピュータゲームの動くキャラクターというのは、たいてい8×8ドット、あるいは16×16ドットで描かれている。
しかし8×8ドット全てがキャラクターの絵で埋まっているわけではない。
人の形をしたキャラクターならば、16×16ドットの全てを人の形に見せるために、特定の色で点灯させる必要はないのは分かると思う。
顔や体の周りには、わずかに使わないドットというのが出てくる。
それらを背景に上書きした時に、何も考えないでやると「黒」で塗りつぶされてしまう。
これではリアルさに欠ける。
だからキャラクターの絵として使ってない部分のドットは、「透明」として扱わなければならない。
単純に一度書いた画面に16×16ドットの絵を上書きすれば良いだけでなく、「透明」として扱うべきドットの時は、「上書きしない」という判定をしなければならない。

そして、これらを動かす場合は、背景は先ほどと1ミリも動いていないとしても、キャラクターが前回とは違う場所に居る場合は、前回キャラクターを描いた場所を消して、裏にあるはずの背景の画像データを読み込んで、もう一度そこに背景を書き直し、それから新しい場所にキャラクターを上書きしないと、キャラクターを動かした時に、「分身の術」でも使ったかのように、残ってしまうw

キャラクターが動くたびに、背景を全てもう一度最初から書き直してってやってたら、それだけ時間が掛かる。
かといって、以前キャラクターが居た場所だけ背景を書き直すにしても、その場所はどこの番地のドットがそれに相当するのかを、計算で導き出さなければならず、その計算がまた難しい。

このように、コンピュータで画面を動かすというのは、非常に大変なのだ。
ましてや画面を動かす機能をグラフィック・チップが持っていなかったり、持っていても低性能だったファミコン時代では、画面全体をスクロールさせるには、非常にゆっくりか、あるいはカクカクしてしまうのは、どうしてもしょうがない事だった。
でもスクウェアにかつて在籍した外国人天才プログラマーは、それをやってみせた。
だから「すげー」って分かる人には驚かれるのだ。

ちなみにファミコンは、コンピュータのこのキャラクターを動かす場合にしなければならない処理の多さや、プログラムの複雑さを軽減するために、「スプライト機能」というのを搭載している。
これは、プログラムやCPUではなくグラフィック・チップ側で、背景とキャラクターの重ね合わせ処理を行ってくれるものだ。
従って、キャラクターを動かした場合に、いちいち以前キャラクターが表示されていた場所に、再度背景を書きなおす処理はしないで良い。
スプライト番号1番のキャラクターが、どこからどこへ移動しましたって教えてやるだけで、スプライト機能を持ったグラフィック・チップが「分かりました」って言って、背景の書き直しと、新たな場所へのキャラクターの上書きをしてくれるからだ。
だからファミコンは、当時のパソコンよりCPUもメモリも劣っていたのに、当時のパソコンには出来ない高速なキャラクターの移動とかが出来たのだ。
しかも何体ものキャラクターが画面上を動き回っても、スピードが落ちなかったのだ。
それを当時のパソコンでやろうとすると、どうしてもCPUの処理能力とプログラムに頼らなければならなかったので、ファミコンほどスムーズに動かせなかったり、ファミコンほど多くのキャラクターを同時に画面上で動かす事ができなかったのだ。

ただファミコンでも、固定された背景の画面上に、たくさんのキャラクターを動かして表示する機能はあっても、画面全体を上下左右に「スクロール」(移動)させる機能は無かった。
それをやる場合は、パソコンと同じように背景を全部その都度書き換えなければならなかった。
そういう処理であれば、CPUのスピードがパソコンより劣るファミコンで、パソコンより早いスピードで動かすなんて出来るはずはないのだ。
でもやってしまった。
だからすごいのだ。

画面全体をスクロールさせる場合のひとつの方法は、あらかじめ用意されている全体のMAP画面みたいな所の、どこからどこまでを画像に表示させるかという方法がある。
ただこれは、指定の位置から順番に新たな画像データをビデオ・メモリに転送するだけという、プログラムの処理としては簡単な部類になるが、同時にあらかじめMAP画面全部の背景グラフィックデータを、メモリなどに常に用意しておく必要がある。
つまり大量のメモリが必要となり、その分プログラムとかで使えるメモリが減ってしまったり、そもそもメモリ自体が足らなくて、そんなに大きな画像データは用意しておけないという事にもなる。

なので通常は、ゲーム画面の背景というのは、キャラクターと同じく特定の形のグラフィックを背景キャラクターとして用意しておいて、それをどういう順番でどう並べるのかのデータだけしか持っていない場合が多い。
ドラクエのフィールドとか見れば分かるだろう。
地面とか山とか湖とか森とか、全て同じ形をしていたと思う。
つまりドラクエのMAPデータというのは、画像データで全MAPを持っているのではなく、ここには「山」とかここには「森」を表示させるみたいな、そういう背景キャラクターの何をどこに配置するかのデータしか持ってないのだ。
こうする事で、メモリを節約できるわけだ。
しかし一方で、画面全体をスクロールさせる場合は、MAPの背景キャラクターの配置情報を元に、1個1個の背景グラフィックデータを読み出して、それをビデオ・メモリに転送してと二度手間になり、処理に時間が掛かるという欠点が出てくる。
しかも背景キャラクターのデータというのは、8×8や16×16ドットで構成された状態のものしか無いので、画面上で「山」が半分だけ見えているとかいう状態を書くのは、めちゃくちゃ難しいし手間だ。

ファミコンのファイナル・ファンタジーは、ドラクエのように山なら全て同じ形、同じ大きさで配置されているとかってのは無かったが、それでも背景は、背景キャラクターの集まりで出来ていたはずである。
ドラクエよりも、多くのパターンの背景キャラクターデータを持つ事で、同じ形の背景がひとつも無いかのように見せていただけで、よーく見れば同じパターンで描かれている場所ってのは沢山ある。

そしてそれらを高速で上下左右にスクロールさせる。
飛行船に乗って移動する時のアレだ。
しかもそのスクロールはまったく「カクカク」しておらず、非常に滑らかで、1ドットという最小単位できちんと画面の変更をしているであろう事が分かる。
(もしかしたら、処理スピードを上げるために1ドットではなく2ドットづつ動かしてるかも知れないがw)

それを高速で行うプログラムを作るのは、非常に難しい。
どういう手順で、どういう計算処理をしていけば、一番速く背景の書き換えが、しかも1ドット単位で行えるか?
それを考え、さらに当時の遅いファミコンのCPUやグラフィック・チップにそれをやらせる。

一説には、ファミコンのCPUやグラフィック・チップの不具合を突いた処理をしているとも言われている。
CPUやグラフィック・チップの不具合というのは、今でもある。
特定のCPUにセキュリティー的な欠陥が発見されたと、よくニュースを見る事があるだろうが、あれがそうである。
ファミコン時代は、ネットに繋がったりしないし、中に重要な個人情報とか企業秘密のデータとか保管されたりしなかったし、する要領の余裕も無かったので、単に本来とは違う動作をする程度のものだが。

この「本来とは違う動作」が、高速スクロールに使えると思ったのだろう。
考えられるのは、例えば今のコンピュータもそうだが、グラフィック・チップに何らかの指令を送る場合は、グラフィック・チップ側が今は暇なので、指令を受け付けられますという信号を検知してから行うのが普通だ。
これを「Vsync」などと言う。
これを無視して命令やグラフィック・データを送ったりすると、画像が乱れたりする。
それまでグラフィック・チップがやっていた作業が、強制的に中断されたり、順番が入れ替わったりしてしまうからだ。
しかし、ファミコンのグラフィック・チップの場合は、グラフィック・チップの都合を聞かないでデータを送った場合、なぜか特定の方向に画像のデータが1ドットづつズレて表示されるとか、そういう不具合があったとすれば、これは「高速スクロール」に利用できるだろうw
なぜなら、プログラムやCPUで、前回の画面より1ドットだけ上下左右にズレた画像を構成する計算処理をしなくて良いわけだからw

まぁ最近は、ゲーム機だけでなく、パソコンやスマホのグラフィック・チップにも普通に高速に画面をスクロールさせるための機能は備わっているだろう。
なので今のゲームプログラマは、そんな処理を一生懸命考える必要はないと思う。
楽になったもんんだ。

つまり何が言いたいかというと、Windowsが世に初めて登場した95の時代とか、動画なんて今より解像度の低い640×400ドットぐらいの画面の、更にそれより小さい画面内でしか動かす事ができなかったのに、その倍以上に増えた今のパソコンの解像度で、画面全体を、フルカラーで動かしてもスムーズに動画が再生できるのは、プログラマが優秀になったわけでも、プログラムの技術が向上したわけでもなく、単にハードウェアの性能が飛躍的に上がっただけって事。
むしろプログラマの腕は、昔に比べてレベルが低くなっているのが現状って事を言いたいのだ。

まぁだからこそ、低予算・短期間で次々と新作の紙芝居ガチャゲーが出せるわけだけどねw


コメントの投稿

非公開コメント

カウンタ
プロフィール

ウホッ!いい男

Author:ウホッ!いい男
異世界転生を待ち続ける中高年のおっさん

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR