Categories: 工作・開発

イヤホンでDOOMを動作、300MHzのCPUと1MB未満のRAMで18fpsを実現

開発者のArin Sarkisianが、オープンソースファームウェアを搭載したワイヤレスイヤホン「PineBuds Pro」でDOOMを動作させるプロジェクト「DoomBuds」を公開した。ディスプレイを持たないイヤホンでゲームを動かすという技術的挑戦に対し、UART経由のMJPEGストリーミングという独自の手法で解決している。

PineBuds Proは、PINE64が販売するオープンソースファームウェアを持つ唯一のイヤホンだ。内部にはArm Cortex-M4Fプロセッサを搭載している。Sarkisian氏は、標準の100MHzから300MHzへCPUクロックを引き上げ、低電力モードを無効化することで、DOOMの動作に必要な処理能力を確保した。

最大の技術的課題は、イヤホンがディスプレイを持たないことだった。映像をリアルタイムで外部デバイスへ転送する必要がある。接続方法としてBluetoothとUARTの2択があったが、Bluetoothは約1Mbpsと帯域幅が不十分だった。UART接続は2.4Mbpsの帯域幅を提供し、これを選択した。

しかし、DOOMのフレームバッファ(320×200ピクセル、96KB)を無圧縮で転送すると、わずか3fpsしか実現できない。そこでMJPEG形式での圧縮を採用した。h264などの最新コーデックはCPUとRAMを大量に消費するため、組み込みデバイス向けJPEGエンコーダライブラリJPEGENCを使用した。

平均的な高品質JPEG圧縮フレームサイズは約13.5KB、敵が少ないシーンでは11KB程度に収まる。理論上の最大フレームレートは22.2〜27.3fpsだが、Cortex-M4FのJPEGエンコード処理能力がボトルネックとなり、実際には約18fpsで動作している。

RAMも大きな制約だった。標準では768KBのRAMしかアクセスできず、コプロセッサを無効化して992KBに拡張した。DOOMは本来4MBのRAMを要求するが、ルックアップテーブルの事前生成、変数のconst化、フラッシュメモリからの直接読み込み、キャッシュシステムの無効化など、多数の最適化で1MB未満に収めた。

ストレージも課題だった。DOOM shareware版のWADファイルは4.2MBあり、PineBuds Proの4MBストレージに収まらない。この問題は、DoomモッダーのFraggletが作成した「Squashware」という1.7MBに縮小されたWADファイルを使用することで解決した。

プロジェクトは4つのコンポーネントで構成される。イヤホン上で動作するDOOMポート、イヤホンとWebサーバー間のブリッジとなるシリアルサーバー、キューイングシステムとMJPEGストリーム配信を担当するWebサーバー、そしてブラウザで動作する静的Webページだ。

doombuds.comでは、誰でもブラウザ経由でSarkisian氏のPineBuds Pro上のDOOMをリモートプレイできる。WASDキーで移動、矢印キーで視点変更、スペースキーで射撃という操作方法だ。複数ユーザーがアクセスする場合はキューイングシステムで順番待ちとなる。

ソースコードはGitHubで公開されており、DOOMポート用のDOOMBudsリポジトリと、ブラウザ連携用のDOOMBUDS-JSリポジトリが提供されている。Docker環境でビルドし、bestoolでイヤホンにフラッシュできる。

Sarkisian氏はLinkedInのプロフィールでソフトウェアエンジニアの職を探していると明記している。

関連情報

DOOMBudsプロジェクト(GitHub)

FabScene編集部

FabScene編集部