今日の雑記

生きることでいっぱいいっぱい

ALERT for GP2X を開発する上での諸々

せっかくだからこれもまとめておこう。
以下、時系列で。

「ALERT」というゲームは元々「P/ECE」というハード向けに作ったゲーム。なので、それを「SDL」向けに移植する必要がある。
いきなり GP2X でもいいんだけど、GP2X の事もよく解らなかったし、「どうせ SDL で動けば動くんだろ?」というふうに考え(これが後々痛い目となって帰ってくるのだが)、まず「WindowsSDL」で動かす事を目標に。
以前も、「P/ECE」向けのゲームを「WindowsDirectX」に移植した事があった(MADE IN WIRED)ので、この段階は難なくクリア。まあ、手間がかかって面倒ではあったけど。

まず素直にビルド。通った。なんだ、簡単じゃないか。
んで動かしてみると、なんかまともに動かない。いや、動いてるんだけど、なんか上キー押すとゲーム始まるしショットは出るし。意味がわからない。
あれこれ Web で調べてみると、ここで「カーソルはボタン定義」というショッキングな事実が発覚。脳内で無くリアルに「なんでやねん」と漏らしてしまう。
GP2X のキーアサインを調べて、どうにかこうにか動かせる状態に。動かせるが、遊べる状態ではない。
この時に抱えていた懸案は以下のとおり。

  • 重い。とにかく。
  • なんか画面がちらちらする。
  • サウンドリクエストが遅延しまくり。

このあたりを色々調べていくうちに仕事が忙しくなったり他のゲーム開発に手を出したりで、いつしか手を離れてしまった。
半年後、昨年末に復活して、まず最初に手を出したのは、何故かまともに鳴らなくなっていた「サウンド処理関連」。
これはまあ、「よくこれで鳴ってたなあ」的なミスがあれやこれやあったので、以前調べていたときに中途半端にソースいじってて放置していたのかなあ、と。色々修正して解決。だけど、リクエスト遅延は相変わらず放置。
次に手を出したのは「処理速度の向上」。
Windows の時は何も気にしてなくて、GP2X に移しても普通に表示できていたので気が付かなかったのだが、実は「640x480」で開発していたのだった。上にも書いたけど、どうやら GP2X 側で「縮小処理」をかけているっぽい。地味に便利だが、余計な事をしてくれたもんだ<どっちだよ
んで、「320x240」にしてみたら一気に処理速度が向上した。
元々 P/ECE の解像度は「128x88」で、それを Windows に移すときに、画面描画関係を「n倍表示」するようにしていたので(この辺は MADE IN WIRED で培ったノウハウ)、解像度を落とす処理は一瞬でできるようになっていたのが幸いした。
しかし、それでもまだ重い。だが、手はまだある。
Windows に移したときに、固定少数だったところを浮動少数にしたのだ。今から考えたら「何でそんなことしたのかしら?」と思わなくは無いが、自前の SDL 環境が既に浮動少数化していたので、それに合わせたんだろうなあと、2008 年のボクは 2007 年のボクを振り返ったのである。ばかやろー。
とりあえず機械的に「float」型を「f32」と置き換えて、「f32」は「typedef SINT32 f32」として、あとは全ソースをほげほげ。1 時間足らずで画面に何か出た。
その後、何故かラインが正常に描画されないなどの諸問題(というかそれだけ)があったが、何とか無事描画できるようになった。わーい。
とここで、無事に描画できるようになったら、別の問題が発生した。
なんかウェイト(具体的には SDL_Delay)が動いて無いっぽい疑惑。実はこれは今だに解決していない。F200 で新たに発生して、F100 の時には起きていない問題だ。
とりあえず「wait(n)」と置き換える事でそれっぽく動いてるようだが、でもなんか違う気がする。情報求む(いねーよなー)。
まあなんとか動くようになったので、最大の懸案である「サウンドリクエストの遅延問題」に着手。
まずは「まともに動いてるサンプルはなんか無いかしら?」とネットをさまよっていたら、GP2X の総本山で「NOIZ2SA」がダウンロードできるではないですか。
早速ダウンロードして動かしてみると、きちんと音が鳴ってる。遅延なし。
「おー!」と思ってソース見てみたら、前にも書いたけど「あー MOD ですかー」という落ち。このときは正直絶望してました。絶望してソースもろくに読みませんでしたが(こら
んで、今あらためてソース見てみたらこんな記述が。

drv_oss.CommandLine("buffer=14,count=2");

この「buffer=14」というのがいかにも怪しい。というか、単位が解らんな。まさか「14byte」って事は無いよね?
「count=2」というのは「ステレオ」という意味かしら?それとも「16bit」ってこと?
んでまあ結論からいうと、上にも書いたように「バッファサイズを減らす」ことで、リクエストの遅延がなくなりました。これは id:sa-y さんの助言で、この方は以前に WindowsMobile に拙作「MADE IN WIRED」を移植してくれた事があり(ちなみに非公開です<えー)、そのときにも同様の問題があったそうで。いやはや助かりました。
最後につまずいたのは、最後に入れた仕様である「セーブデータの保存」。
色々試行錯誤した結果、SD カードによって「最終的にファイルとして存在するまでにかなり時間がかかるものがある」ということ。手元の SD カード(2G MicroSD)だと、Windows ではすぐに書き込めるのに、GP2X で保存しようとすると、たった 16byte 書いただけで 20 秒待ってやっとファイルとして認識される、という酷い状態。
これも、上記に書いたように、プログラム上から Linux のコマンド(sync)を呼ぶことで解決できました。
以上が、「ALERT for GP2X」を移植した顛末です。何かの参考になれば幸いですが、そもそも GP2X で開発しようなんて奇特な野郎がそれほどいないと思われるので、書いただけ損かも<ひどい