ゲームの仕組みを紙芝居に例えてみる

例えばこういう特殊な紙芝居を想像してほしい。
絵は全く用意されておらず、お話が語られるのと同時に描かれていく。
語り部と絵描きはそれぞれ別人で、絵描きはお話の内容をあらかじめ知らされてはいない。

語り部は一枚分のストーリーを読み終えると、一定時間待ってから次の分のストーリーを読み始める。絵描きはその待ち時間内で、読まれた通りの絵を一枚仕上げなければならない。
さらに、それを見ている客はストーリーに口出しする権利を与えられており、語り部はそれに応じて筋書きを柔軟に変えていかなければならない。これを観客が満足するまでひたすら繰り返す。

この忙しい紙芝居を、

  • 語り部 : CPU
  • 絵描き : GPU
  • 絵 : フレーム(コマ)
  • 観客 : プレイヤー
  • 口出し : 入力

に置き換えたものが今日の一般的なビデオゲームの形式だとだいたい言えると思う。
ただし、絵は現実の紙芝居とは比べものにならないほどの速さで切り替わっていくし、それでいて一枚一枚の変化は緩やかなため、人間である観客の目にはあたかも絵が動いているかのように認識される。ゲームの世界とはカクカクしたドットの集合だった頃から変わらず、このようにして表現されている。(実際はもう少し複雑だが、技術者以外にも分かるように細部は省きたいと思う。)

フレームレート

ゲームハードのスペックを語る際にはよく出てくる言葉だ。60 FPS とか 30 FPS とかいうやつである。FPS とは Frames Per Second, すなわち一秒間に絵(フレーム)が何回更新されるかを表す単位であり、数字が大きいほど絵の動きが滑らかに見えるというわけである。
これは紙芝居の例えになぞらえるなら、絵描きが一枚の絵を仕上げるのに与えられる時間を表す数値ということにもなる。

60 FPS なら絵描きは一秒間に 60 枚の絵を描く必要があるから、一枚を描くのに六十分の一秒、約 0.016 秒の猶予が与えられる。30 FPS ならその二倍の約 0.033 秒でいい。

いずれにせよ、人間が絵筆を持たされて同じことをやれと言われても到底不可能な芸当だが、ここで言う絵描きとはグラフィックス・プロセッサ、絵を描くことに最適化された計算機であり、彼らはプログラムに記述された一定のアルゴリズムに従って、粛々とこの仕事を遂行する。

ラグ

どのようなアルゴリズムにも必ず一つ以上のステップが存在する。また、いかなる計算機も機械である以上、その計算速度には物理的な限界が存在する。
GPU がいくらボブ・ロス並みの優秀な絵描きとはいえ、あまりに複雑な絵を注文されると締切以内に完成させることができないことがある。この時に発生するのが、俗にいうラグやコマ落ち、あるいは処理落ちといった現象だ。

再び紙芝居の例えに戻ろう。ちょい趣向を凝らしてストーリー仕立てで。

――語り部は一枚分を読み終え、絵描きがその内容を絵に仕上げるのを一服しながら待っていた。物語はクライマックスに向けて怒涛の展開を見せ、先刻の語りは熱を帯びていた。

ふと絵描きの方に目をやると、荒々しく絵筆を動かす画家の額にはいつの間にか汗が浮いていた。視線を戻し、短く青い煙を吐いてから腕時計に目を落とす。読み上げてから既に 0.016 秒が経過していた。そろそろ続きを語り始めなくては。

しかし画家の腕はまだ激しく動いている。その横顔からは珍しく焦りの色が見てとれた。最初は 64 匹だった悪魔の群れが、約 1920 フレームほど前から分裂をし始め、つい 120 フレーム前に 65536 匹まで増えてしまったことが彼を苦しめていた。許容量を超えたオブジェクトの描画要求に、画家の右腕は悲鳴を上げていたのだ。

フレームスキップ

GPU がその処理性能の限界により、持ち時間以内にフレームを描画しきれなかった場合、CPU はどうするか。これには二つの解決法が存在する。

a. 描画が終わるのを待つ
b. 描画をスキップする

それぞれ長所と短所があり、どちらを採用するかはゲームデザイナーに委ねられるべきところだろう。

前者を採用している場合、画家が視界に入る大量の分裂悪魔を一匹残らずスクリーンに描き切るまで物語は進まない。次のタバコに手を伸ばそうとした語り部を見て観客はブーイングを入れるかもしれない。
結果としてプレイヤーが体験する現象は、良くてスローモーション、ひどければカクカクとコマ送りのように再生される映像となるだろう。

後者はフレームスキップと呼ばれる手法で、締切の過ぎた描き途中の絵をビリビリに破り捨て、語り部は時間通り物語を進めてしまう。画家にとっては辛い選択かもしれないが、一回くらい絵が変わらないことがあっても大抵の観客は許してくれるだろう。あるいはそのことに気づきすらしないかもしれない。
しかし、それが二回三回と頻繁に続くなら話は別だ。その場合にプレイヤーが認識するのは、前後の動きに繋がりのない、ぶつ切りの、文字通りの紙芝居のような映像となってしまうだろう。これならコマ送りのほうがまだマシだと思えるかもしれない。

怒首領蜂
怒首領蜂 © CAVE

もし、大量の敵弾をかいくぐるといった繊細な操作を要求されるような状況で突然フレームをスキップされたら、プレイヤーにはまるで弾が瞬間移動しているかのように見えるだろう。故にほとんどのシューティングゲームは前者を採用している。消える魔球なんてアニメだけで十分だ。

逆にフレームスキップが必須といえるゲームもある。ひとつは音楽がゲーム性と密接に関わっているタイプのもの。もっと言うなら BGM に合わせてなんらかの入力を要求してくるゲーム。

Thumper
Thumper © Drool

こういうゲームは BGM とゲーム内世界の時間軸が完璧に同期していることが必要条件である。また、処理落ちが発生したからといって BGM の方をそれに合わせるなどということは色んな意味で難しいだろう。ノリノリでプレイしてる時に脈絡も無くリズムを変えられたらプレイヤーも興ざめである。だから描画の間に合わないフレームはスキップするしかない。


ふと思い立って、今回はゲームがプログラム的にどう動いているかを例え話で解説してみた。極めて原理的な部分の説明に過ぎず、実際にはこの上に数え切れないほどの様々な技術が積み重なって今日のゲームは作られている。

この話が少しでも面白いと思っていただけたなら、是非ゲーム制作に挑戦してみてほしい。パソコンとインターネットがあれば制作環境としては十分だ。

Leave a comment - コメントを残す