htop で DOOM を実装する
ビルド方法
doomgeneric ディレクトリに移動
make -j8 コマンドでビルド
- WAD ファイル(ゲームデータ)が必要。このプロジェクトには
freedoom1.wad が含まれている(Freedoom プロジェクトにすべてのクレジット)。または、クラシックな無料シェアウェア版 DOOM1.wad をダウンロードして使用可能
実行方法
仕組み
- https://github.com/ozkl/doomgeneric プロジェクトをフォークして作業
main.c、keylogger.c、ascii_stuff.c ファイルを追加し、一部を修正
- シンプルな画像→ASCII 変換器を作成(
ascii_stuff.c の長い if 文)
- メインの doom プロセスが ASCII 画像の行数ぶん子プロセスを生成し、各プロセスごとに共有メモリセグメントを作成
- メインプロセスは各行を対応するプロセスのメモリセグメントにコピーし、各子プロセスは自分のセグメントを読んで
argv[0] を上書き
- もともとは CPU 使用率でプロセスを並べ替えようとしたが難しかった。Linux の
nice も検討したが、ユーザーが設定できる値が 19 個しかないため断念
- 仮想メモリ割り当て量を使うアイデアを思いついた。これはプロセスごとに固有
- すべての子プロセスがまったく同じメモリを割り当てても、
htop では正しい順序でフレームが表示される。おそらく同一の場合は生成時刻順に並ぶと推測
- キーボードデバイスを開くシンプルなキーロガーを作成。
htop の起動有無に関係なく、ゲームは常にバックグラウンドで動作
対応プラットフォーム
- Ubuntu 22.04 でのみテスト
- WSL と Arch ではキーボードデバイス名が異なる。移植が必要
トラブルシューティング
- キーボードが動作しない場合
main.c の KEYBOARD_DEVICE マクロを確認。プラットフォームごとに異なる可能性あり
ll /dev/input/by-path コマンドで kbd を含むデバイスを選択
- フレームが止まる場合
sed コマンドが機能しなかった可能性あり
htop で F2 -> "Display options" -> "Update process names on every refresh" をチェック
sed: can't read /home/<user>/.config/htop/htoprc: No such file or directory エラー
htop を一度も起動していないために発生。htop を起動して終了し、sed を再実行
- メインの doom プロセスが死んでゾンビプロセスだけが残った場合
改善点
- 方向キーで移動すると
htop の画面が動いてしまい不便
htop 起動後にフォーカスを変更することで対処可能(例: a キーを押してプロセッサ選択メニューを開く)
FAQ
- Q: なぜ作ったのですか?
A: 面白そうだったからです。
ライセンス
- Freedoom は BSD スタイルライセンス(
freedoom-license.txt 参照)
- 残りのコードは GPL と推定
GN⁺の意見
- ASCII アートで 3D ゲーム画面を表現するのは新鮮なアイデア。C で htop のように画面へグラフィックを描くよい例になりそう
- 単に画面を ASCII アートに変えるだけでなく、実際のゲームエンジンと連動して実装した点が印象的
- 既存の
doomgeneric プロジェクトをうまく活用し、少ないコード量で実装した点も高く評価できる
- キーボード入力を受け取るために Linux デバイスを直接開く方式は、WSL やほかの OS 環境では動作しない可能性がある。OS 非依存のキー入力ライブラリの利用を検討してもよさそう
- 共有メモリを使って親子プロセス間で ASCII フレームデータをやり取りするアイデアが興味深い。IPC の学習にもよい例
- ASCII グラフィックを htop のプロセス名に入れる発想も創造的。ただし、htop がプロセス名変更によって画面を動かしてしまうなど副作用もあり、改善が必要そう
- GPL ライセンスと推定されるが明確ではない。コード再利用時はライセンス確認が必要
1件のコメント
Hacker Newsの反応
このコメント群は、
htopを使ってASCIIでレンダリングされたDoomゲームをプロセスとして動かすプロジェクトに対する反応をまとめたもの。主な内容は次のとおり。htopをレンダリングエンジンとして活用した発想が印象的で、ソフトウェアハックの真髄を示している。