親指サイズのボード「ESP32-C6-LCD-1.69」にDOOMを移植、外付け部品なしで音楽も鳴る

親指ほどの大きさのマイコンボードに、DOOMのシェアウェア版が丸ごと収まった。外付けのメモリーもSDカードも2つ目のマイコンも使わず、音楽と効果音を鳴らしながら毎秒30コマ近くで動く。「DIABLITO」としてGitHubに公開されており、作ったのはaedile氏である。

使うのはWaveshareの「ESP32-C6-LCD-1.69」で、20ドル(約3100円)ほどの基板に1.69インチの液晶、スピーカー、電池の充電回路が載る。ここでシェアウェア版の9面すべてと、デモ、メニュー、自動地図、8チャンネルの効果音、AdLib音源を模した音楽が動く。

DOOMはあらゆる機器で動かされてきたが、ESP32での先例はどれも4MBの外付けメモリーを前提にしていた。ESP32-C6にはその機構がない。RAMは512KBで、うち82KBはBluetoothの処理が常時占める。CPUは160MHzのRISC-Vが1つだけになる。

出発点にしたのは、Graham Sanderson氏がRaspberry Pi Picoのマイコン向けに作った移植版だ。4.2MBのゲームデータを2MBに圧縮し、内部のデータ構造を16ビットに切り詰め、面のデータをRAMに読み込まずに描く。ただしこの実装は2つのコアと、Pico独自の回路を前提にしていた。

作業の中心は、2つのコアを1つにまとめることだった。描画をまとめ、画面への転送だけを切り出している。転送は待ち時間が大半を占めるため、1コマ分を16行ずつ送り出している間に、次のコマを別の領域へ描ける。

最も効いた高速化は、コンパイラの設定1つだった。処理時間の解析で、全体の37%が1つの関数に費やされていることが分かった。原因は、ESP-IDFが既定でassertを有効にしていたことだ。テクスチャの展開処理が画素ごとにassertを通っていた。これを無効にすると、列の描画が1コマあたり9〜14ミリ秒から7〜8ミリ秒に縮んだ。

音楽の処理も削った。AdLib音源の再現は本来の周波数で動かすと1コマあたり15ミリ秒かかり、22fpsまで落ちる。作者は動作周波数を半分にし、音程が狂う分を設定で補正した。音階を1オクターブ上げ、音の立ち上がりと減衰をそれぞれ1段階上げる。どちらもちょうど2倍なので正確に補える。処理は1コマあたり約4ミリ秒に縮んだ。

結果として、音楽と効果音を鳴らし、Bluetoothのゲームパッドをつないだ状態で平均29.5fpsが出ている。20fpsを下回るコマは全体の1.3%。空きメモリーは37KBだった。作者は、READMEに載せた数値はすべて実機からシリアル経由で測ったものだと明記している。

ライセンスは由来ごとに分かれる。DOOM由来のコードとESP-IDF向けの移植部分がGPLv2、Pico版の新規コードがBSD-3になる。シェアウェア版のデータは同梱されているが、商用版は含められない。

関連情報

fabsceneの更新情報はXで配信中です

この記事の感想・意見をSNSで共有しよう
  • URLをコピーしました!

最新記事

YouTube / PodCast

【PR】読んで役立つ注目記事

目次