D’s Production 2019/10/31 10:43

《虐殺大陸の明けぬ夜4》理想への挑戦と敗北

前回は経路検索のアルゴリズムを思いつかなかったという話を書いた。
今回も引き続きゲームプログラミング的な話で、興味のない方には本当に興味のない話だと思うのだがお許しいただきたい。
自分のプログラミング(といってもウディタ──Wolf RPGエディターによる擬似的なプログラミングだが)技術の不足により、理想的なゲーム・プレイの環境を作れたとは言い難い。
しかし悪戦苦闘の末、解決できた部分もある。できなかった部分もある。
この(未熟な)ゲーム開発者の苦悩というものを読者の方にも知っていただきたい。

永遠の命題──軽快な挙動を目指して

快適なプレイ環境とはどんなものか?
プレイヤーが操作したとおりに挙動するというものであろう。
端的に言うとラグがない、もしくは非常に少ないということである。
ボタンをおして1秒後に主人公が動く、というのでは、プレイヤーはストレスで怒り狂うに違いない。おそらくは0.1秒でも大変なストレスである。
《虐殺大陸》では様々な要因により「処理が重い」とか、「処理が重いように感じられる」という場面がゲーム全体にわたって出てきてしまった。
ちょっと私の気にし過ぎのところもあるかもしれないが、人から見ても明らかにそう感じられるであろうものも多い。

指数関数的に増える処理数

《虐殺大陸》は擬似的にではあるがリアルタイムで進行する陣取りゲームである。
フィールドマップにおいては各国は任意のタイミングで師団を派遣することができ、その師団は時間の経過に従って経路を自動で進軍していき、敵軍と接触すれば交戦になる。
 「敵軍と接触すれば交戦になる」
口で言うのは容易いが、これをプログラミングするとなると、そう簡単にはいかない。
読者の中には日常的にプログラミングをしている人がいて、いや簡単だと言うかもしれない。
画面上をキャラクターが既に動いている。ということは何らかの形でキャラクターの座標(x,y)が変数に格納されているはずである。キャラごとにそれらを取得して、キャラAとキャラBの座標が一致または接近したときは条件分岐で交戦の処理に移ればいいだけではないか?
本当にその通りではあるのだが、既に見た通り、このゲームはリアルタイム・シミュレーションなのである。ターン制ではない。
そして大陸には6つの国があり、同時に作れる師団は20個である(これは私自身があえてそう設定した)。同時に最大で120師団が存在する。それは稀なケースであるにしても、だいたい10~20個の師団が存在するのは常である。
仮に10の師団(師団A、B、C・・・J)があるとすれば、次のような処理が必要になる。

 師団Aの座標(Xa,Ya)取得
 ┗師団Bの座標(Xb,Yb)取得
  ┠XaとXb、YaとYbが一致する→交戦の処理へ
  ┗一致しない
   ┗師団Cの座標(Xc,Yc)取得
    ┠XaとXc、YaとYcが一致する→交戦の処理へ
    ┗一致しない
     ┗師団Dの座標(Xd,Yd)取得
      ┠XaとXd、YaとYdが一致する→交戦の処理へ
      ┗一致しない
       ┗師団Eの座標・・・・

つまり師団Aの座標と師団B~Jの座標の比較、
   師団Bの座標と師団C~Jの座標の比較、
   師団Cの座標と師団D~Jの座標の比較・・・
と延々とすべての師団の座標同士を比較し、一致するかどうかを調べなければならないのである。(ちなみに「一致」ではなく「接近」とすると、それぞの座標にさらに-5、+5などをして範囲を広げることになる。さらに処理が増える。)その数だけで45である。もちろん師団の数が増えれば増えるほど、この数はねずみ算式に増えていく。
しかも、それをほぼ毎フレームごとに行わなければならない。ウディタのFPSは60。つまり1秒間に60回の処理を行っているということであるが、上の処理を1秒間に60回の速度で行わなければならないということになる。
1秒間の処理数で言うともう少し少なくしてもよい。しかし少なくとも各キャラが移動するごとに行わないといけない。もしそうでないと、敵軍や敵城を「すり抜け」てしまうという事態が発生しかねない。
詳しくは知らないのだが、おそらく、現代の並のパソコンだと上の程度の処理ならば簡単に行えるのではないだろうか。しかし安定した動作を保証するためなのか、ウディタ上で上のような膨大な処理を行おうとすると動作が極端に重くなる。つまりカクカクすることになる。
このような声はウディタのゲーム制作者からはしばしば聞かれ、アクションゲームなどでキャラや弾が増えれば増えるほど処理が重くなるのでその数を制限しなければならないという経験をした人は多いのではないだろうかと思う。
《虐殺大陸》でも同様のことが起こった。

《虐殺大陸》では、キャラ(師団)はあらかじめ決められたルート(街道)を通ることになっており、それ以外は一切通ることができない。(開発中、よくルートから逸れるバグが起こって難儀した・・・)
ということは、同一の街道や地点にいる師団同士は接触する可能性があるが、それ以外は絶対に接触しないということである。
ということは、例えばルート①には師団AとBとCがいるということを把握しておけば、師団AについてはB・Cとの座標が重なっていないかだけを検索すればよいということなる。仮にフィールド全体には他に何十と師団がいようとも関係ない。BとCについても同じである。
具体的には、各地点ごとのデータベースを用意して、師団Aが地点①にいると地点①に追加、師団Aが地点①から地点②に移る瞬間に地点①からAを抹消し地点②に追加、というような処理をしている。
(人間ならば言葉で理解できるが、コンピューターにこれをさせるのはそれほど簡単なことではない。師団ごとのデータベースに、当該師団のいる地点を格納、それをもとに地点ごとのデータベースからその師団の情報が書き込まれているデータを検索する、という処理が必要になる。ウディタは優れたソフトだが、この辺りの処理はプログラマーの「人力」とでも言うような力技が必要である)
これで「師団同士が重なっていないか」ということを検索する処理の重さは激減することができた。

これを応用すると「フィールド全体を区間ごとに区切って、その区間ごとに存在するキャラだけで(重なっていないかを)処理する」という発想が生まれてくると思う。
仮に全体が100×100マスのチェス盤のようなものだとすると、
    X座標0-9を①、10-19を②・・・90-99を⑩
 同様にY座標0-9をA、10-19をB・・・90-99をJと区切ると、
区間①A、②A、③A・・・⑧J、⑨J、⑩Jと、フィールド全体を100個の区間に区切ることができる。
こうすると、《虐殺大陸》のように進行ルートが決まっているわけではない作品、縦横無尽にキャラクターがフィールド上を行き来する作品でもある程度の処理の軽減が可能になるだろう。
実は《虐殺大陸》の前身である《リョナラーの野望》ではこのような手法で処理しようとしたのだが、各区間のちょうど境界にいるキャラ同士が「すり抜け」てしまう現象が起こった。おそらく師団Aが①から②に、師団Bが②から①にそれぞれ同時に移動したので互いに重なる区間が存在せずすり抜けてしまったのであろう。
だから区間は0-11を①、9-21を②、のようにややそれぞれの区間に重複する幅をもたせるのがいいように思う。

リアルタイムであるがゆえの苦悩

いかに師団同士が重なっていないかの処理をスムーズにしたとしても、リアルタイムで行わなければならない処理はそれだけではない。
師団がある曲がり角や交差点に達したら方向転換をしなければならない。
また敵同士が接触すれば交戦が必要になる。
敵も常に自軍の心配をしており、失った兵の補充をし、手薄な城には増援を送るという判断もする。
やることは盛り沢山である。これを考える頭脳は(現実では人間の数だけいるはずだが)ユーザーのパソコン1つなのである。
しかし幸いなことに《虐殺大陸》はアクションゲームではない。
あるいはアクションゲームでも、例えばシューティングゲームで敵や敵弾の数が多いときは「処理落ち」によってあえてゲーム進行がゆっくりになるのが許容されるようなこともある。これと同じことをすればよい。
もし現行のスピードで「カクカクする」のであれば、スピードを半分にすればよいのである。
あるいは、アクションゲームのような精密な操作が求められる種類のゲームではないので、「カクカクする」ことをあらかじめ許容してもよいのではないか。
こうして「ゲームの進行速度」と「安定性モード」という2つのオプションが付けられた。
どれだけ挙動がゆっくりになるのかを、ユーザーに選ばせるのである。
はじめから師団の歩行速度=ゲームの進行速度をプレイヤーに選ばせるというのが「進行速度」である。
またフィールド上にキャラクターが増え処理項目が多くなるほど、処理途中にウェイトを挟むようにしたものが「安定性モード」というものである。これで、キャラが増えるほど結果的に進行速度は遅くなるもののスムーズな挙動が保証できる。
しかしこの「安定性モード」はOFFにすることもできる。そうすると敵が師団を作成したときや敵同士の交戦など諸々の重い処理があったときには一瞬ゲーム全体が止まる。これは快適なプレイ環境とは言い難いが、しかしゲームの進行速度自体は上がる。結果としてプレイ時間自体は短くなるのである。
リアルタイム進行のゲームだからこそ生じる無用な待ち時間というものがある。これを減らすことは非常に重要なことである。判断はプレイヤーに委ねることにした。一応開発者のスタンスとしては、「基本的に安定性モードはONにします」と安定した挙動を推奨しているが、ある程度プレイに慣れてきたプレイヤーはOFFにしたのではないだろうか。ちなみに私自身は常にOFFにしていた。

《虐殺大陸》最大の欠陥

上記のことはある程度解決できたことであり、ユーザーとしてもそれほど気にならないことかもしれない。
最後に、これだけは解決できなかった、作者として指摘されると最も心苦しい問題について触れておきたいと思う。
「指揮官の立ち絵」問題である。

《虐殺大陸》では資源を消費して指揮官をほぼ無限に作成することができるようになっている。敵も次々に指揮官を作成してくる。
それぞれの指揮官には立ち絵が付いており、ランダムで自動生成される。1人1人が微妙に違う立ち絵で、一応《虐殺大陸》の売りの1つになっている(とは言うものの、実はこれについては私自身も疑問を感じているところもある。この話は次回以降に譲りたい)。
「ランダムで自動生成される」というのは、顔、髪、身体などの各パーツが用意されており、それらをランダムで組み合わせるという、所謂「福笑い」システムである。
兵科ごとの基本があり、あとはそれぞれの差分である。だから基本が兵科数──つまり7つしかなく、あまり代わり映えのしないものであるが、おそらく《虐殺大陸》制作で最も苦労したことの1つであろう。

さて、その指揮官立ち絵の表示の仕方なのだが、各パーツをそれぞれPNG形式の画像ファイルとして用意しており、必要パーツをすべて表示するという方式をとっている。
兵科によっても異なるが、1人の指揮官に、下(奥)から順に後ろ髪・身体・横髪・顔・表情・前髪と大体6枚程度の画像を表示している。サイズは800×600ピクセル。PNGである。
いくら基本が7兵科分とはいえ、各パーツに3~5種類程度の差分を用意すると、その画像数は推して知るべし、である。莫大な枚数である。その1つ1つを必要部分だけ切り出し、位置を調整して表示、などとしていては製作期間はあと1年以上は伸びていたであろう。だからすべて一律で800×600ピクセルとした。PNGである。
それを一気に6枚前後表示する。1つ1つのサイズは微々たるものだが、それらを一気に表示するとその瞬間に「ラグ」が発生する。
この辺りはマシンパワーにも依存することとは思うが、指揮官の画像の出る場面、特に戦場でなどでのカーソル移動は開発者である自分としても「最も思うように操作できない」場面である。自分の操作にゲームがついていかない。私が嫌う「快適でない」ゲームそのものであった。問題は指揮官の画像だけではないが、指揮官の画像が問題なのは間違いない。
「事前ロード」の機能を付けた。
交戦に参加する指揮官はあらかじめわかっている。つまりその交戦中に表示される指揮官の画像もわかっている。それらを、交戦が始まった直後に画面外に表示させておくのである。そうすると画像が表示される瞬間のラグはやや解消される。ただし完全ではないようである。

ここで新たな問題が発生した。
参戦する指揮官数が少ないうちは問題ない。しかしゲーム終盤になるにつれて大軍同士が激突することになり、60部隊vs80部隊、などとなってくると話は変わってくる。
ゲームの挙動に明らかな異常が現れるようになった。
交戦が進むにつれて画像の表示がおかしくなってくる。表示されるはずの画像が表示されない。指揮官の画像の一部だけが表示されて、顔無しや首なしの指揮官が出てくる(怖い)。
ウディタのデバック機能を使って表示画像一覧を見ると、明らかに狂っている。目に悪い蛍光色の紫の長方形が至るところに現れる。


挙げ句の果てに、さらに重いデータ(音声データなど)を読み込んだ瞬間にゲームがフリーズする。
「Game.exe は応答していません」
画面をクリックすると白くなる。悪夢である。
せっかく屍の山を築き、敵の要衝を攻め落としたその瞬間である。プレイヤーならばコントローラーを投げ捨てるであろう。(このゲームはキーボードでのプレイ推奨なのだが・・・)

参戦指揮官が30人を超えるときは、すべての指揮官画像をロードすることはやめた。しかしロードしないとあまりにカクカクする。
そこで味方指揮官だけはロードすることにした。敵指揮官は戦場に配置された者(最大10人)をターンのはじめにロードする。戦場に配置されていない敵指揮官は消去する。こうすると最大90人のロードで済む。
サイズの大きい音声データを読み込むときは、音声データをメモリから開放することにした(これはウディタの機能である)。
これで、自分のパソコンでは急にゲームが落ちることはなくなった。
「自分のパソコンでは」である。リリース後の報告によると、未だに同様の状況でゲームが落ちることはあるらしい。やはりパソコンのスペックによるのであろうが、スペックの低いパソコンを使っているユーザーを責めることはできない。明らかに作者の責任である。

指揮官画像が問題である。これが重すぎる。
スマートな方法ではないが、姑息な手段に出ることにした。「サイズの小さい」指揮官画像データを用意したのである。
画像一括変換ソフトで指揮官画像のすべての大きさを半分にする。400×300ピクセルに、である。データサイズとしては1/4くらいになるのだろう。
システム設定に、指揮官の画像の「軽量化表示」を付けた。これを選択すると、400×300ピクセルの画像が引き伸ばされて、ややモザイクの掛かったような「画質の荒い」指揮官画像が表示される。処理の重さは劇的に改善された。
さらなる対処として、(個人的には禁じ手であるとおもっているのだが)「指揮官の画像 非表示」も選択できるようにした。完全に指揮官の画像を表示しない。処理の軽さは最大である。
ゲームが先である。正直なところ、指揮官画像は作者のこだわりであって、プレイヤーの求めているものでもあるまい。
逆にゲーム性を求めていないプレイヤーは、《虐殺大陸》のメインターゲットではない。作者の迷走っぷりが見えるというものである。

最善の解決策は全てのパーツを組み合わせたものを1枚の画像として用意することなのではないかと思っているが、既に見たように、パーツ数は膨大に上り結果として出来上がるバリエーション数は1万を超えるのである。つまり1万枚の個別の指揮官画像を用意することになるのだが、それは制作者が途中で過労死するであろう作業となることは間違いない。よしんばそれをしたとして(書き出しのためのプログラミングができれば楽勝であろうが・・・)、そのファイルを全て格納したゲームデータは何GBになるであろうか? どちらにしても難しい話である

本当にユーザーフレンドリーなゲームの開発を目指して

何はともあれ、ゲームが途中で落ちるという最悪の事態は回避できた。
正しくは、回避する手段は提供できたのだが、ここにも誤算は生じた。
自分としては、これら指揮官画像の軽量化の設定は操作説明などで強調して説明しているつもりであった。(1ページ丸々割いて説明している)
しかしそれでも上記のように、リリース後にユーザーからフリーズのことが指摘されたことからもわかる通り、ユーザーにはあまり知られておらず、作者が後から個人的に教える、ということが度々あったのである。
今思えば、大人数交戦の途中で説明を挿入するなど、無理矢理にでもユーザーに認知させるなどの工夫をすればよかったのだが、その手間を惜しんでいたのである。
説明書を読まないユーザーが悪いのか、説明書を読まないユーザーを想定しない作者が悪いのか問題は微妙なところだが、私個人としては説明書がなくてもある程度のプレイはできるゲームを目指したいとは思っている。《虐殺大陸》は明らかにそれには至っていない。
(本当は「チュートリアル」を付ける予定でいたのだが、手が回らなかったのである。)

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

記事を検索