Xbox 360 シューティングラブ。10周年 『開発こぼれ話』その15『XIIZEALからTRIZEALへ』その3

前回の話題に出てきたXIIZEAL/PCデバッグ版の映像だ。通常は見えないフレームバッファ以外のVramも表示している。PSとGNETの違いが分かる人がニヤリとする動画だ。

開発で使用しているPCはCorei7。PC版XIIZEALが爆速で動く。ソフト的に大きな変更はバイトオーダーの違いぐらいだから簡単にXbox 360で動かせるだろうと思ったら、そうは簡単に行かなかった。とりあえず動いたXbox 360版はスローだったのだ。

ひとまず高速化の手段としてSIMDを試す。PC版を作った頃はマルチメディア命令MMXって言ってた奴だ、使う機能はパックド演算。XIIZEALはαブレンド等の透明演算を多用しているのでRGB各要素を一度に演算出来るパックド演算を使用すれば処理時間の短縮が出来るはずだ。実際PC版では15fps程度高速化出来た。それに合わせPSの16bitフレームバッファを32bitフレームバッファに切り替える機能も既にある。32bit版なら16bitピクセル情報をパックド演算する32bit形式にその都度変換する必要が無いのでかなり高速化出来るはずだ。やってみた。驚いた。まったく速くならない…頭を抱えた。アーケード押しの僕は家庭用機のPSでは再現出来ないようなゲームにしようとPSの1.5~2.0倍の性能を誇るAC基板GNETの限界近くまでαブレンドやVramを使いまくっていたのだ。そんな当時の自分を軽く呪うが、そんな場合では無い。タイムリミットは容赦なく迫る。

計算を高速化しても状態は変わらない。計算に必要な値をメモリから持って来るのと計算結果をメモリに書き戻す処理が遅いのが原因だった。頭の回転を速くしてもデータをやり取りする足が遅いのでどうにもならない。さすがに7年前の2005年に出たゲーム機のRAM速度は現状のコンピュータ事情からすると時代遅れ。Xbox 360にも高速なRAMは有るがそれを使うにはDirectXのルールに則って作らなければならない。残念ながら今回は自前ソフトウェア描画なので、その対応をするには軽く1週間は必要。しかもそれで解決する保証はない。他に使える機能は無いものかMSの資料を閉じてひとまずググった。なぜならMSの資料は適切な情報の集約と編集がなされておらず、知りたい事柄に辿りつくまで無駄な時間が掛かるからだ。じっくりと資料を当たる時間が惜しい程事態は切迫している。

Xbox 360のCPUは3コア。使えそうなモノが見つかった。現在の動作速度は目的の70%程度、偶数フレームバッファと奇数フレームバッファを別のコアで並列に処理すれば倍の140%のパフォーマンスが出るはず。プログラムの修正も小一時間で行ける。試してみた…

見事解決!何が役に立つか分からない。ゲーセンラブ。の開発時レガシーデバイスであるJVSのレスポンスを改善する為、使用していないCPUコアを用いてアクセス時間を隠蔽する実験をしていたプログラムが参考になった。お陰で発売日を遅らす事無くプロジェクトは進行したのだ。