世界を動かす技術を、日本語で。

「Doom」がイヤフォンに移植されました

概要

  • Pinebuds ProでDOOMを動作させた技術デモ
  • インターネット経由でリモートプレイが可能な仕組み
  • ハードウェア制約を工夫で突破した解説
  • ソースコード・技術情報も公開
  • プレイ体験やシステム構成の詳細説明

インターネット接続イヤホンでDOOMをプレイ!

  • Pinebuds Pro で1993年の名作 DOOM を動作させたプロジェクト
  • WASD で移動、 矢印キー で視点操作、 スペース で射撃、 Shift でダッシュ
  • Eキー でドアやオブジェクトとインタラクト、 数字キー で武器切り替え
  • Escape/Enter でメニュー、 Tab でマップ表示
  • 死亡時は Eキー でリスポーン
  • プレイヤーは キュー制、自分の順番・待機人数・待ち時間が表示

そもそもこれは何なのか?

  • 1993年の DOOMイヤホン で動かし、さらに インターネット経由で遠隔操作 できるデモ
  • Pinebuds Pro 専用、 オープンソースファームウェア 搭載イヤホンのみ対応
  • 他のイヤホンでは動作不可

ソースコードの公開と自分での実行

  • DOOMBuds リポジトリ:DOOMをイヤホン上で動かす移植版
  • DOOMBUDS-JS リポジトリ:ブラウザからイヤホンとやりとりするための仕組み
  • 誰でもコード参照・自分のPinebudsで実行可能

Twitch配信について

  • Twitch配信帯域コスト削減のための最適化
  • キューで 5番目 になると 低遅延MJPEGストリーム に自動切り替え

システム構成の概要

  • プロジェクトは 4つのパート で構成
    • DOOM移植版 (イヤホン上で動作)
    • シリアルサーバ (イヤホンとWebサーバの橋渡し、MJPEG→Twitch変換も担当)
    • Webサーバ (アセット配信、キュー管理、キープレス転送、MJPEG表示)
    • 静的Webページ (ブラウザ表示/サーバ通信制御)

ハードウェア制約への対処

  • ディスプレイ非搭載 のため、データ転送は Bluetooth または UART接点 経由
  • Bluetooth は最大1Mbpsと遅く、 UART (2.4Mbps)が最適
  • DOOMのフレームバッファ は96KB(320×200×8bit)
  • UART帯域 では3FPS程度しか出せず、 MJPEGストリーム で圧縮送信
  • JPEGフレーム は高品質で約13.5KB、平均11KB程度
  • 理論最大FPS
    • 楽観値:27.3FPS
    • 保守値:22.2FPS

CPUとRAMの工夫

  • CPUクロック を100MHz→300MHzへ上昇、低電力モード無効化
  • Cortex-M4F (300MHz)はDOOM動作に十分、JPEGエンコードがボトルネック
  • 最大18FPS程度が限界
  • RAM は標準768KB、コプロセッサ無効化で992KB
  • DOOMは4MB必要 だが、各種最適化で削減
    • ルックアップテーブル事前生成、不変変数のconst化、フラッシュから読み込み、キャッシュ無効化、不要変数削除

フラッシュメモリの工夫

  • DOOM 1シェアウェアWAD は4.2MB、イヤホンの容量は4MB
  • fragglet 氏作成の Squashware WAD (1.7MB)を利用
  • これにより全データがフラッシュに収まる

まとめ

  • Pinebuds Pro を使った超小型デバイスでの DOOM移植リモートプレイ
  • ハードウェア制約を 圧縮・最適化・OSS活用 で突破
  • ソースコード・技術情報 も公開され、DIYも可能
  • 技術詳細や今後の解説記事・動画も予定

Hackerたちの意見

こんにちは、DOOMをPinebuds Proイヤフォンに移植しました!インターネット経由でアクセスできるので、キューに参加してPCから私のイヤフォンでDOOMをプレイできますよ!詳しい情報やGitHubリポジトリへのリンクはサイトにあります。

PineBuds Proってどうなの?持ってる人いる?Pine64のIRCネットワークにはPineBudsの話をするチャンネルがないから、聞く機会がなかったんだよね。

正直、ちゃんとした目的で使ったことはないんだ。快適さや音質がどんな感じか全然わからない。Pine64のDiscordにはPinebudsのチャンネルがあるから、そこで質問してみてね :)

今朝も使ってたよ。発売されてからずっと使ってる。素晴らしいデバイスだけど、バッテリーはかなり限られてて、ANCオンだと最大で約2時間かな。

私も気になる!以前はPine64の大ファンだったけど、e-inkタブレットや電話のトラブルでちょっと気持ちが冷めちゃった。

Doomの移植リスト: https://en.wikipedia.org/wiki/List_of_Doom_ports

使い捨てVapeチップに移植されたDOOMの投稿を待ってるよ :-D

https://www.youtube.com/watch?v=rVsvtEj9iqE

大体の電子タバコに使われてるPuya PY32シリーズのMCUは、RAMが3KB、ROMが24KBなんだけど、Doomを動かすには最低でも4MBのRAMが必要なんだよね。モーアの法則が使い捨て電子タバコの計算能力にも当てはまるとしたら、10年後にはその投稿が見られるかもね :)

なんか、Doomを動かせるくらいの一般的なハードウェアを搭載した、いわゆる「雑用デバイス」を見るたびに、これはソフトウェアの勝利なのか、それともラジオで音声を送るための安価な専用ハードウェアを作れなかった経済的失敗なのか、考えちゃうよね。

それとも、第三の選択肢として、スケールメリットのおかげで、過剰な性能だけど多くのアプリケーションにとって最も安価な選択肢になってるってことかな。

でも、もうすでに作るのはすごく安いよね。少ないお金で、超小型の形状に大量の処理能力を詰め込むことができるし(消費者のマージンとかは無視して)。ANCを搭載したイヤフォンで、いろんなオーディオ規格に対応して、低バッテリー待機もできて、干渉にもある程度強い。数メートルの距離で送受信できるのは、価格を考えたらすごいことだよね。33年前のゲームを動かせるだけの処理能力があるっていうのも、技術の進歩を感じるよね。今のスマホ一台の計算能力は、1980年の全世界の計算能力を合わせたよりも多いんだから。

イヤフォンには、マイクのビームフォーミングやノイズキャンセリングみたいな、かなりの処理能力を必要とする機能があることが多いよね。Teamsのインスタンスでファンを回したり、Home AssistantがRaspberry Piをひざまずかせたりするのと比べたら、全然不当じゃないよ。

CPU: デュアルコア 300MHz ARM Cortex-M4F Doomがリリースされてから、ハードウェアのスケーリングがすごいことになってるよね。確かに、これは明らかにオーバースペックだけど、面白いのはこれがイヤフォンに収まるってことだよね。

Doomが動くなら、マルウェアも動くってことだよね。

市場経済の成功を経済的失敗として捉えようとする人たちを見るのは驚きだよ。ハードウェアは安くて小さくなったから、イヤフォンで『DOOM』が動かせるのに、これが悪いことだと思わなきゃいけないの?

どちらでもないよ。これはソフトウェアとハードウェアの両方で、ますます複雑なことができるようになった証だね。イヤフォンは、より洗練された圧縮を行って帯域幅を節約したり、より高度なノイズキャンセリングやマイクの分離アルゴリズムを動かしたりするために、余分な計算能力をうまく活用できるべきだよ。もっと(無料の)計算能力があれば、改善できないデバイスなんてほとんどないしね。前の世代のプログラマーたちが、少ない計算リソースで面白いゲームを作れるようになったのも素晴らしいことだよ。

ASICの中の小さなマイクロプロセッサの限界コストなんてほとんどゼロだよ。RAMはちょっとお金がかかるけど、フレンドリーにファームウェアをアップデートしたいなら、更新をステージングするためのRAMが必要だね。

無駄な計算能力は、物質的資源の無駄と相関していると思うのは直感的だよね。でも、実際にそうなのかな?

ページの下の方を見ると、技術スキルをアピールするために仕事を探している人の広告があるよ。

ちょっと脱線するけど、ジョン・カーマックがゲームエンジンが複雑になるにつれて、自分で全部の(エンジン)コードを書くのを諦めて、他の人の貢献に頼るようになったって言ってたのを読んだことがあるよ(これはDoom 3のリリース後のインタビューでの話)。今のAIの時代に彼がどう感じているのか気になるな。

ジョンは今、AGIを現実にするためのミッションに取り組んでるんだって。彼自身の投資を考えると、きっとポジティブに考えてるんじゃないかな。ただの推測だけどね。それに、「Masters of Doom」は本当にいい本だよ。カーマックやロメロ、iDソフトウェアがDoom(やWolf3Dなど)を作った裏側を覗いてみたい人にはおすすめ。

カーマックはDoomの開発中にAIを広範囲に使ってたんだよね:近似補間。

いつもDoomってのがちょっと悲しいな。昔、若い頃に遊んでたけど、ハマっちゃったんだよね。良いゲームだとは思わないけど、やっぱり中毒性があった。シンプルだったし。じゃあ、何が問題なの?ゲームが今はもっと大きくて、複雑になってるから、小さいプラットフォームに移植するのはほぼ不可能に近いんだよね。これが悲しい。インディーやスタートアップを除くと、業界はここで完全に焦点を失ったと思う。今流行ってるゲームには全然興味がない。面白いアイデアもあるけど(「リトルナイトメア」は好きだった)、でもそれらは巨大で、昔のゲームとは全然違うし、しばしばもっと退屈だよね。例えば、私のお気に入りのDOSゲームの一つは「マスターオブオリオン1」だった。欠点が多いにもかかわらず、何度も何度も遊べたんだ。「マスターオブオリオン2」も悪くはなかったけど、あんなに中毒性はなかったし、ゲームプレイももっと複雑で遅かった。新しいゲームも時々は良いけど、例えば「ウォークラフト3」みたいに。全ての新しいゲームが悪いとは言わないけど、ゲームがまるで観るための動画みたいに簡略化されて、インタラクティブな要素がほとんどないように感じる。私の意見では、それは本当のゲームじゃない。XPを稼いで次のレベルに進むために、HPが増えてダメージを与えるだけの作業も、実際には遊んでるわけじゃない。時間の無駄だよね。

同感だよ。イヤフォンで「フリースペース2」をプレイしたいな。

Doomが選ばれるのは、かなり人気のあるゲームで、オープンソースで、リソース要件も低い(でもあまりにも低すぎると簡単すぎる)、人々が興味を持つ革新的なカスタムエンジンが使われていて、育った時に多くの人が尊敬したり憧れたりした人物によって作られたからなんだよね。ゲーム自体もクールだし、今ではそれを選び続けるだけの慣性があるんだ。

ほとんどの人は、ゲームが昔は小さかったのは、そうする必要があったからだってことに気づいてないんだ。ほとんどのユーザーにとって、小さいことの価値はほとんど存在しない。帯域幅の制限があるなら、確かにダウンロードサイズは重要だけど、ほとんどの人には関係ない。だから、最も意味のある変更は「ちゃんと動くか」と「ディスクに収まるか」だけなんだ。もっと分かりやすく言うと、「動けばそれでいい」ってのが、ほとんどの消費者が(多分正しく)パフォーマンスの最適化やインストールサイズを扱う方法なんだ。君が言ってる犠牲は、消費者の明確な要望で行われたものだよ。ゲームは「十分長い」必要があって、十分なゲームループとグラインディングの違いは好みの問題だし、ゲームは「きれい」である必要があって、良くも悪くもスタイライズには努力が必要で、これも好みの問題なんだ(「ゼルダの伝説 風のタクト」を見てみて)。一方で、豪華な高解像度のライティングエンジンは一般的に良いと認識されてる。インディーによって作られると、最適化がひどくなることもあるけど、スタイライズされた短いゲームの数は驚くほど多いから、見つけるのが難しいこともあるよね。特に、1~2時間のゲームが同じ長さの映画と同じくらいの影響力を持つのは難しいから、あまり話題にされないことが多い。

イヤフォンにはディスプレイがないから、データの送受信はBluetoothかUART接触パッドを使うしかないんだ。Bluetoothはかなり遅いから、安定した1Mbpsの接続ができればラッキーだよ。UARTの方が断然いい選択だね。これって、各イヤフォンでDoomを動かせるってこと?両方のイヤフォンの計算能力を使う分散アプリを作るのは実現可能?

これはストレッチゴールだったんだ、マルチプレイヤー。片方のイヤフォン対もう片方。実装自体はそんなに難しくないけど、まずは他のことを片付けないと。分散計算に使うのは面白い発想だね、自由意志の使い方としてはxD

あと数年ともうちょっとRAMがあれば、このイヤフォンで素晴らしいローカルのKubernetesクラスターが動かせるようになるね。

[遅延]