イベント
[GDC 2016]PS4のゲームをMS-DOSに移植? 8bit風アクション「Retro City Rampage」開発者が21世紀におけるDOSゲーム開発を語った
Retro City Rampageの開発元である,Vblank EntertainmentのBrian Provinciano氏によるセッションの概要をレポートしよう。
現行世代のゲームを1.44MBのフロッピーディスク1枚に収めろ
セッションのテーマになっている「Retro City Rampage」というゲームは,8bitゲーム機風のレトログラフィックが特徴のアクションゲームだ。
ビジュアルがレトロなだけでなく,多数のプラットフォーム向けにリリースされているのも特徴である。現時点での対応プラットフォームは,
Provinciano氏がMS-DOS版の作成にあたって目指したのは,i486クラスのCPUで十分に動作することと,メモリ使用量を4MB以内に抑えること,そして,ゲーム全体を記憶容量1.44MBのフロッピーディスク1枚に収めることの3点だったという。
フロッピーディスクといわれても,見たことがない読者のほうが多かったりするかもしれないが,ペラペラの薄い樹脂の円盤上に磁性体を塗って,磁気でデータを記録する記録メディアのことだ。。大昔のPCにはHDDすらなかったので,フロッピーディスクからOSやプログラムを読み込んで,実行していたのである。
MS-DOS向けの開発環境がそもそもない!?
さて,目標を設定しては見たものの,実現には当然ながら,いろいろと困難が多かったそうだ。まず第一に,開発環境がない。「最近のシステムなら良い統合開発環境があったり,素晴らしいドキュメントが整備されているが,MS-DOSのプログラミング環境はすべてここにある」と述べてProvinciano氏が表示したのは,廃棄されたコンピュータの山である。説明するまでもないが,MS-DOS向け開発環境など,すべてゴミになっているということだ。
「486DXをネイティブで搭載するマシンは,ebayで探さないことには手に入らない。また,ドキュメントは(紙の)本であり,これまたリサイクル品を探さないと手に入らない」とProvinciano氏。なにはともあれ,動作要件相当のPCと統合開発環境,そして,もとになるRetro City Rampageの主要プラグラムコードをあまり変更することなく,MS-DOS向けにコンパイルできる環境が必要だったという。
開発環境としては当初,懐かしい人もいるだろう「Borland C++ 5.02」に目をつけたものの(※最終バージョンでもMS-DOSアプリの開発ができた),C++のTemplateが使えないために放棄。最終的に,「Watcom IDE」を選択したそうだ。Watcom IDEというのは,かつて商用だった「Watcom C++」コンパイラを含む無料の開発環境である(関連リンク)。
開発環境は決まったが,MS-DOSと今のOS環境とでは,いろいろと事情が違う。「まず違うのはグラフィックスだ」とProvinciano氏は述べた。MS-DOS時代のグラフィックス表示には,VGAと呼ばれたグラフィックス表示回路のハードウェアにアクセスする必要があり,ゲームエンジンやOSやドライバソフトなどで多層化された現在のOSと違うのは当然である。
筆者もかつて,MS-DOS上でVGAハードウェアにアクセスする方法を書いた解説書を出したことがあったりするので,Provinciano氏の話は,説明を聞かなくてもよく分かる話だったりする。
MS-DOS版Retro City Rampageでは,VGAの「MODE 13H」を使うことになったそうだ。「MODE 13Hは256色が表示できるモードで,1ドットが1byteに対応する。そのため,とても簡単で速い」と,Provinciano氏は選択の理由を述べている。
VGAの詳しい説明が講演の趣旨ではないので省略するが,MODE 13Hは,320×200ドットで256色表示が行えるVGAの画面モードのこと。もとを質せば,VGAよりも古い「MCGA」というゲーム向きのグラフィックスシステムで導入された表示モードだったりする。
もう1つ,開発で大きな問題として立ちはだかったのが「システムタイマーの割り込み」(IRQ0)だそうだ。「(MS-DOSにおける)システムタイマーの値(※割り込み周期)は55ms。これでは60fpsで表示しようとしても,1フレームに1回のタイマー割り込みすら入らない」(Provinciano氏)。だが幸いなことに,タイマー割り込みの周期は変更できるので,Provinciano氏は最小値である13.75msに変更することで対応したという。
ところで,「ゲームなら,V-Sync割り込みを使うのが当たり前では?」と思った人もいるかもしれない。実のところ,MS-DOS時代のVGAは,V-Sync割り込みが標準ではなかったのである。そのため利用できないPCもあったので,V-Sync割り込みを前提でゲームを作れなかった,というわけだ。思えば不自由なアーキテクチャだったものである。
そのほかにも,ゲームパッドは直接I/Oポートを読まなければならないとか,サウンドカードは標準搭載ではないので,PCスピーカー(※ビープ音のことだ)を使うといった具合に,いろいろな制限があったそうだ。そうした問題を乗り越えて,Retro City RampageはMS-DOSへ移植されたのである。
MS-DOSへの移植が新たなアイデアのヒントをもたらす
さて,こうした苦労を経て,3つの目標はどれくらい達成できたのだろうか。
最初の「486DXでも動く」という性能面だが,これについてProvinciano氏は,なかなか印象的なことを述べている。MS-DOS時代のゲームで性能を最適化するなると,すぐに「アセンブラを使う」という発想にとなるところだ。しかし,Provinciano氏曰く「大抵の場合は,アルゴリズムがアセンブラを上回る」ことが分かったそうだ。
ただし,コードの書き方によって効率には善し悪しが生じるので,そこは注意が必要とのこと。下のスライドはその例だが,これはMS-DOSに限った話ではなく,現代のアプリケーション開発でも起きる一般的な話である。
メモリ使用量を4MBに抑えるという目標は,MS-DOSのメモリ割り当てシステムに問題があったものの,とくに支障なく乗り越えられたという。一方で,記憶容量1.44MBのフロッピーディスク1枚に収めるという目標は,かなり苦労があったそうで,いろいろと工夫したものの,1.58MBになってしまったそうだ。
そこで,まずアセットを簡略化した。下のスライドで一目瞭然だが,もとになったプラットフォームの画面に比べると,装飾がだいぶ少なくなっている。さらに,コリジョン判定用のオブジェクトをあらかじめ作っておくのではなく,メモリに読み込んだ後で生成するといった手法も取り入れることで,なんとかデータ量を減らしたそうだ。
しかし,それでも1.44MBには圧縮しきれなかったので,コンテンツの一部はやむなくカットしたそうである。こうした多大な苦労を経て,MS-DOS版をフロッピーディスク1枚に収めることができたと,Provinciano氏は述べていた。
フロッピーディスク1枚に収まったRetro City Rampageだが,HDDへのインストーラも付属しているとのことだ。
さて,この話を読んで,「無駄なことをしているなあ」と思った人もいるだろう。2016年にもなって,MS-DOS用のゲームを作る技術が,何の参考になるのかと。だが,Provinciano氏は,講演の最後に「MS-DOSへの移植から得た経験は,ほかのプラットフォームにも活かすことができる」と述べている。
たとえば,高速化に適したコードの書き方やデータ削減のテクニックは,どのプラットフォームでも有用であろう。スマートフォン向けゲームのように,データ量はなるべく削減したいというときにも,役立つ考え方はありそうだ。
とはいうものの,やはりProvinciano氏は,レトロなハードウェアでのプログラミングが好きでたまらないのだろう。グラフィックスの描画テクニックを説明するところで,スーパーファミコンのROMカートリッジに使われていたメモリ管理チップの話が飛び出したりと,セッション中にはたびたび,ゲーム開発オタクっぷりを炸裂させていたからだ。
そんなProvinciano氏のオタクっぷりが詰まったRetro City Rampage。さすがにMS-DOS版をプレイするのは厳しいだろうが,興味が湧いた人は,プレイ可能なプラットフォーム版でプレイしてほしい。
「Retro City Rampage」公式Webサイト(英語)
4Gamer GDC 2016関連記事一覧
- この記事のURL: