不可能な移植の物語: Quake はどのようにしてゲームボーイアドバンスに移植されたのか

Quake をゲームボーイ アドバンスに移植することは不可能に思えましたが、Randy Linden はそれを成功させました。 その方法は次のとおりです。

ゲームボーイアドバンスは任天堂が開発した携帯型ゲーム機です。 2001年に日本で発売され、ゲームボーイカラーの後継機として機能しました。 16.78 MHz で動作する ARM7TDMI、32 kb の内部ワーク RAM、256 kb の外部 RAM、および 96 kb の VRAM を搭載していました。 これは最も強力なマシンではありませんが、多くの人にとって懐かしいゲームがハンドヘルド用にたくさんあります。 しかし、このデバイスで日の目を見なかったゲームの 1 つは、今日私たちが知っている一人称シューティング ゲームのジャンルを定義するのに役立った id Software によって開発されたゲーム、Quake のプロトタイプ移植でした。

Quake は、素晴らしいサウンドトラックと中毒性の高いゲームプレイを備えた、信じられないほど緻密なゲームで、DOOM と同様に、考えられるほぼすべてのデバイスに移植されています。 ゲームボーイ アドバンスへの移植は、3D グラフィックスをネイティブにサポートしていないため、特に驚くべきものであり、任天堂は特に携帯端末を 2 次元のゲームプレイ体験として宣伝しました。 それでも、Randy Linden は独自のポートを開発することを止めませんでした。

Modern Vintage Gamer の許可を得て使用した、Analogue Pocket でプレイした Quake ポートの写真

Linden について詳しくない方のために説明すると、彼は bleem! と bleem! の両方の開発者として最もよく知られています。 (PlayStation エミュレータ) と DOOM の SNES 移植です。これは、id Software の共同創設者である John Romero 氏がかつてインタビューで語った成果です。 シャックニュース 彼はそれが可能だとは思わなかった。 リンデンの開発能力は、ゲームボーイ アドバンスで Quake を実現できるのはおそらく彼だということを証明しました。

このポートは、Forest of Illusion プロジェクトを通じて Linden 自身がリリースしたおかげで明らかになりました。 幻想の森は任天堂のゲームの歴史を保存することを目的としたプロジェクトであり、リンデン 彼は、256MB のフラッシュ カードで見つけた Quake ポートのコピーを配布するために連絡を取りました。 所持。

私たちの質問に答え、この記事の技術的な正確性を保証するために時間を割いてくださった Randy Linden に感謝いたします。 私たちも感謝したいと思います モダンヴィンテージゲーマー 彼のビデオから必要な静止画を使用することを許可してくれました。 この移植は id Software や ZeniMax とは公式には関係がなく、Linden によって単独プロジェクトとして開発されました。

Quakeのゲームボーイアドバンス移植版

技術的に言えば、Quake がゲームボーイアドバンスと同じレベルまで動作するのは驚異的です。 良好なフレーム レートで実行され、元の Quake ゲームの正しい照明とカラー パレットが維持されます。 武器やモンスターも含め、すべてが 3D です。 ゲームボーイアドバンスのゲームは通常スプライトを通じて3Dグラフィックスを実現していましたが、これは本物でした。 他の 3D ゲームがハンドヘルドで行っていたようにレイ キャスティングを利用しておらず、ポイントさえ達成しています。 ダイナミックな錯覚を実現するパレット変更トリックによるプリレンダリングされたオブジェクトの照明効果 点灯。

明確にしておきますが、この移植は完全なゲームではなく、リリース用に作成が完了したら、Linden が id Software に引き渡すつもりだったプロトタイプです。 しかし、ゲームボーイ アドバンスの人気は衰え始め、その代わりに、リンデンによって書かれたカスタム エンジンは、後に完全にリンデンによって開発された別のゲーム、サイボイドのエンジンになりました。 リンデン氏は、「コードの大部分」がゲームボーイアドバンス版のオリジナルのARMコードのままであると語った。 Cyboid を試してみたい場合は、古いバージョンが Google Play ストアで入手できますが、現在は公式 APK が配布されています。 アマゾンアプリストア ゲームには低レベルの 32 ビット コードが大量に含まれているためです。

サイボイド開発者: R and R Digital, LLC.

価格:無料。

3.3.

ダウンロード

リンデンは、Cyboid の初期バージョンの 1 つである iPod ビデオ上で実行されるコードのビデオも共有してくれました。 これは、Game Boy Advance への Quake 移植に使用されたのと同じエンジン コードに基づいて構築されました。

Quake の Game Boy Advance 移植版には、リンデンが公開していないように、ゲームの公式アセットは一切含まれていません。 公式 Quake を含む E1M1 バージョンの配布について、id Software または ZeniMax に連絡しました。 資産。

現在配信中のゲームもデバッグビルドです。 起動時に R キーを押したままにすると、プレーヤーはゲームの 2 番目のマップに直接移動し、D-パッドの左を押したままにすると 3 番目のマップに移動します。 マップの交換は、プレイヤーが死亡したときにもアクセスでき、プレイヤーが最初に攻撃するまでモンスターはプレイヤーを攻撃しません。

音楽に関しては、デモでは公開されている .S3M ファイルが使用されており、サウンド ミキサーはステレオ音楽とサウンド エフェクトの両方を処理します。

技術的な境界

ゲームボーイ アドバンスに関しては多くの境界があり、移植が困難でした。 最大の障害のいくつかは、クロック速度の低さ、ハンドヘルドの 3D グラフィックス機能の欠如、浮動小数点ユニット (FPU) の欠如でした。 途中には他にもたくさんの問題がありましたが、これらはリンデンが私に問題があると説明した特に問題点でした。 本題に入る前に、ゲームボーイアドバンスのレイアウトを理解することが重要です。

Modern Vintage Gamer の許可を得てスクリーンショットを使用

ゲームボーイ アドバンスには 3 セットの RAM があります。1 つは内部ワーク RAM (IWRAM)、もう 1 つは外部ワーク RAM (EWRAM)、そして 3 番目はビデオ RAM (VRAM) です。 32kb の IWRAM は、迅速な実行のために ARM 命令を保存するために使用されますが、256kb の EWRAM は、Thumb のみの命令と小さなデータ チャンクを保存するのに最適です。 として ロドリゴ・コペッティのメモ, EWRAM は、IWRAM よりもアクセスが最大 6 倍遅くなる可能性があります。 ゲームボーイアドバンスは32ビットハンドヘルドとして販売されているにもかかわらず、EWRAMの形式のメモリの大部分は16ビットバス経由でのみアクセスできます。 IWRAM には 32 ビット バス経由でアクセスできます。 Game Boy Advance の VRAM は 96kb で、主にグラフィック データを保存するためのものですが、CPU のメモリ マップ内にあり、通常のメモリ ストレージとしても使用できます。

Thumb 命令は 32 ビット ARM 命令のサブセットであり、16 ビット ワードにエンコードされた命令のセットです。 多くのスペースを占有せずに 32 ビット命令の利点をすべて備えているため、最適化された開発を効率的に行うことができます。 これは、EWRAM のアクセスは遅いものの、効率的な Thumb 命令は、多くの場合、格納されている ARM 命令と同じくらい高速になる可能性があることを意味します。 ただし、Thumb 命令の欠点は、必要な ARM 命令に相当する Thumb が存在しない場合があることです。 実行する。 EWRAM は、基本的にはラスタライズ コードによってスキャンラインごとにトレースされるポリゴン エッジのリストである 3D 数学変換ロジックの出力を保存するために使用されました。

Linden が私に語ったところによると、ポート全体の中で最も複雑で困難な部分はスキャンライン レンダラーでした。 これは、一連のピクセルを VRAM に描画するように設計された、高度に最適化された 10,000 行を超える ARM アセンブリ コードで構成されています。 スキャンライン レンダラーは 32kb I​​WRAM のほとんどを使い果たしました。 カメラに最も近いエッジがアクティブになってレンダリングされ、本質的には大きな BSP (Binary Space Partitioning) ツリーになります。 十分な IWRAM がなかったため、ポリゴン変換出力の結果をエッジ テーブルに保存するために VRAM が使用されましたが、ゲームボーイ アドバンスの VRAM は依然として EWRAM よりも高速です。 グラフィックもここに保存され、表示されました。

彼は、可能な限り最速の実行時間を確保できるようにするための最適化に多くの時間を費やしました。 実行時間を短縮するために彼が行った 3 つのことには、次のものが含まれます。

  • 実行前にコードを自己変更したため、必要な命令が少なくなりました
  • 逆数、サイン、コサイン、タンジェントなどに対して一連のルックアップ テーブルを使用しました。
  • レジスタの値を保存したり復元したりせずに、追加のレジスタ (「変数」のようなもの) にアクセスできるように、CPU の「モード」を切り替えました。

CPU モードを切り替えて追加のレジスタを取得することは、CPU に近い値にすばやくアクセスして 1 クロック サイクルで取得できるようにする非常に賢い操作です。 リンデン氏が私に語ったところによると、ゲームボーイ アドバンスの RAM に値を保存するには時間がかかるのに対し、レジスタを切り替えて値を取得することは 1 クロック サイクルで可能でした。 CPU 自体は 16.78 MHz プロセッサーであり、1 秒あたり 16780000 サイクルを完了できます。 大変なように思えますが、画面上のすべてのピクセルを計算して描画する必要がある場合、それらはすぐに加算されるため、できるだけ多くの操作を削減することが重要になります。

上記はゲームボーイアドバンスに内蔵されているARM7TDMIチップセットの汎用レジスタのリストです。 通常、開発者は「システムとユーザー」モード内でのみレジスタにアクセスし、それ以外では通常の変数を使用します。 ただし、彼はチップセットの 7 つのモードすべてでレジスタを利用しました。そして、その最も優れている点は、 モードを切り替えても他のモードのレジスタの値は保持されるため、モードを切り替えることができます。 彼ら。

面白いことに、リンデンは、バンク切り替えの方法によって Nanoboy Advance エミュレータのバグがどのように発見されたかについても言及しました。 結局のところ、そのエミュレータはレジスタへの保存や切り替えに CPU の他のモードを使用することをサポートしておらず、彼の Quake デモはそれを実際に実行する最初の既知のゲームでした。

リンデンは、作成したメモの一部の写真を私たちに共有し、適切な FPU がない場合に浮動小数点計算をどのように最適化したかについて説明しました。

上の画像は、Linden がメモから共有してくれたもので、特に興味深いのは「その他の ARM サイクル命令数」です。 彼は、計算のクロック サイクル数を削減できるように、計算のサイクルを最適化する方法を考案しました。 彼が私に説明したところによると、8 ビットの数値は 1 クロック サイクルで乗算され、16 ビットの数値は 2 クロック サイクルで、32 ビットの数値は 3 クロック サイクルで、64 ビットの数値は 4 クロック サイクルで乗算されます。 。

「[ARM プロセッサでは] 2 つまたは 3 つの実行段階がありました。 たとえば、レジ​​スタ 1 とレジスタ 2 を乗算し、その結果をレジスタ 3 に入れるとします。 レジスタ 1 とレジスタ 2 を乗算するのではなく、レジスタ 2 が 16 ビットの数値であることがわかっている場合は、次のようになります。 それを反転して、レジスタ 2 とレジスタ 1 を掛けます。そうすれば時間が節約できるからです。 サイクル。"

彼は、このようなことをした理由は、ゲームボーイのパフォーマンスをすべて絞り出すためだったと語った。 多くの計算が行われている場合、あちこちで保存されるクロック サイクルが実際に加算されるため、前進します。 実行されました。 自己書き換えコードについては、Linden に説明してもらいました。

「プログラムは[ストレージ]から来ており、プログラムの大きなブロックを内部RAMに転送して実行します。なぜなら、その方が速いからです。 各 RAM アクセスは非常に遅いため、ROM から RAM への大きなブロックの DMA [ダイレクト メモリ アクセス] を実行してから、実際のプログラム コードを変更します。 たとえば、ARM にはオペランドを左または右にシフトしたり、命令セットの一部として特定のビットをマスクしたりする機能があります。 この命令では、どのビットをマスクするか、または何ビットだけシフトするかを指定します。 そこで、シフトする必要があるビット数に基づいて、実行しようとしているものを変更するコードを生成します。 別の例は、3D 行列の乗算に関するものです。 そこにはたくさんの乗算が含まれています。 乗算を行う実際の命令を内部 RAM に生成し、それを実行して、実行中にコード自体の一部を構築することになります。」

自己変更コードには、特にデバッグに関しては、特有の欠点があります。 また、コードが別の実行シーケンスにジャンプしてメインスレッドの貴重な計算時間を奪う可能性がある分岐命令も不要になります。 リンデン氏はまた、ルックアップ テーブルは ROM 内で完全に整列されており、左にシフトされた 8 ビット値の完全な倍数になると語った。 ルックアップ テーブルのサイズは非常に大きく、RAM に収まりません。また、アラインメントにより、テーブルのベース アドレスを取得するための追加のロード命令の必要性も回避されます。

結局、最終プロトタイプは 2 年近くかけて開発されました。

Randy Linden の Quake ポートの将来

私はリンデンに、Quake ポートの将来はどうなるのかと尋ねたところ、彼は、 公式Quakeを搭載したバージョンのリリースについてZeniMaxとid Softwareに問い合わせることを検討中 資産。 彼はまた、ある時点でソースコードを公開する予定だが、古いコンピュータが必要なため、現時点ではビルドできないと語った。

Randy Linden が開発用にゲームボーイアドバンスをコンピュータに接続するためのセットアップ。

リンデンになぜ『Quake』を選んだのかと尋ねると、彼はこのゲームが大好きで、『DOOM』をSNESに移植したことがきっかけで、この「不可能なプロジェクト」への挑戦が大好きだったと語った。 同氏はまた、スペースの制約からゲーム全体が移植できたとは考えていないが、ゲームの大部分は同じエンジン内にあった可能性があるとも述べた。

ゲームボーイ アドバンス用の Quake をチェックすることに興味がある場合は、以下でチェックできる Forest of Illusion でのリリースを必ずチェックしてください。


幻想の森からダウンロード