ABA 氏のミニゲームが Arduboy とかで遊べたら面白うそうだな~とか常々思っていたら、本人がそれっぽいことをやり始めた。
ただ、個人的に懸念していたのは、ABA 氏のゲームは敵だろうと地形だろうと大量にアクターを生成して、すべてのアクターがそれぞれ画面外判定や衝突判定などを行うという作りなので――別に、ABA 氏だけがそうというわけでなく、最近のゲームの作り方はむしろそれが標準的なのかもしれないけど、とにかく、実行速度やメモリサイズがそれなりに求められるだろうな、ということ。他のプラットフォームならともかく、Arduboy に移植するのはかなり厳しそうだなと。
M5Stack Basic に勝手移植した際のビルド結果でメモリ使用量のおおよその見当がついていたのだが、実際 Arduboy 環境でビルドが通る程度にコードをいじったところ、
最大2560バイトのRAMのうち、グローバル変数が50291バイト(1964%)を使っていて、ローカル変数で-47731バイト使うことができます。
とか言われる始末。
Arduboy は画面描画用のバッファとして 1kiB 使っているわけで、残りの 1.5kiB で各種オブジェクトを管理しなければならない。とにかく、メモリを削るための施策をあれこれ行ってみた。
- タイトル画面のリプレイ機能廃止
- const 宣言だけだと RAM を消費するので、PROGMEM を付与
- HitBox をはじめとした各種配列の数を半分~1/4に
- 直線や円弧描画時の四角形の数やパーティクルを間引き
- 各種構造体について、座標などを int8 で保持し、複数の bool はビットフィールドで実現
- キャラクターデータや音データは事前にバイト配列の形に変換
他にもいろいろ細かい調整を行った結果、どうにか現実的なところまで削減することができ、Arduboy 上でいくつかのゲームを再現することに成功。
…ということで、元々のライブラリからかなり手を加えてしまったので、改めて crisp-game-lib-arduboy と銘打って GitHub 上に公開した。
ゲームも3つだけ移植して、エミュレーターで遊べるようにしてある。もし、まだ元気が残っていたら、もういくつかゲームを移植するつもり。
個人的には Arduboy は2年前にオワコンのつもりだったが、これといいこれといい、なんだかんだでまだ愛着が残っているのだなと。
半年くらい前に RP2040 を使用した Arduboy 後継機の噂がちらほら出ていたように思うが、本家では Arduboy Mini なるものをリリースしようとしているっぽい。ちっこいガジェットは何とも言えない魅力があるのは否定しないが、あまりに小さいのは Thumby で懲り懲りなので、性能がオリジナルと同一なのであれば、新たに買うことは無いだろうなぁ。
そもそも、RP2040 ベースのプラットフォームであれば、今回のようなケチ臭い作業をしなくてもすんなり移植できたような気がする。いつまで ATmega32U4 なんてへっぽこなチップを使い続けるつもりなのだろうか…