2 ポイント 投稿者 GN⁺ 2024-04-22 | 1件のコメント | WhatsAppで共有

htop で DOOM を実装する

ビルド方法

  • doomgeneric ディレクトリに移動
  • make -j8 コマンドでビルド
  • WAD ファイル(ゲームデータ)が必要。このプロジェクトには freedoom1.wad が含まれている(Freedoom プロジェクトにすべてのクレジット)。または、クラシックな無料シェアウェア版 DOOM1.wad をダウンロードして使用可能

実行方法

  • 重要な作業は事前に保存しておくことを推奨
  • 古いノートPCでも問題なく動作することを確認
  • 以下のコマンドを実行:
    sed -i 's/update_process_names=0/update_process_names=1/' ~/.config/htop/htoprc
    sudo ./doom-htop -iwad freedoom1.wad
    htop -d 1 -s M_VIRT
    
  • doom-htophtop の実行順はどちらでもよい
  • キーボードデバイスを開くために sudo が必要。安全面が気になる場合は sudo なしで実行してグラフィックだけ鑑賞することも可能
  • htop-d 1 は 10FPS の更新速度のため。-s M_VIRT は仮想メモリ割り当て順でプロセスを並べ替えるため
  • sed コマンドは、htop がデフォルトではプロセス名を毎回更新しないため必要

仕組み

  • https://github.com/ozkl/doomgeneric プロジェクトをフォークして作業
  • main.ckeylogger.cascii_stuff.c ファイルを追加し、一部を修正
  • シンプルな画像→ASCII 変換器を作成(ascii_stuff.c の長い if 文)
  • メインの doom プロセスが ASCII 画像の行数ぶん子プロセスを生成し、各プロセスごとに共有メモリセグメントを作成
  • メインプロセスは各行を対応するプロセスのメモリセグメントにコピーし、各子プロセスは自分のセグメントを読んで argv[0] を上書き
  • もともとは CPU 使用率でプロセスを並べ替えようとしたが難しかった。Linux の nice も検討したが、ユーザーが設定できる値が 19 個しかないため断念
  • 仮想メモリ割り当て量を使うアイデアを思いついた。これはプロセスごとに固有
  • すべての子プロセスがまったく同じメモリを割り当てても、htop では正しい順序でフレームが表示される。おそらく同一の場合は生成時刻順に並ぶと推測
  • キーボードデバイスを開くシンプルなキーロガーを作成。htop の起動有無に関係なく、ゲームは常にバックグラウンドで動作

対応プラットフォーム

  • Ubuntu 22.04 でのみテスト
  • WSL と Arch ではキーボードデバイス名が異なる。移植が必要

トラブルシューティング

  1. キーボードが動作しない場合
    • main.cKEYBOARD_DEVICE マクロを確認。プラットフォームごとに異なる可能性あり
    • ll /dev/input/by-path コマンドで kbd を含むデバイスを選択
  2. フレームが止まる場合
    • sed コマンドが機能しなかった可能性あり
    • htop で F2 -> "Display options" -> "Update process names on every refresh" をチェック
  3. sed: can't read /home/<user>/.config/htop/htoprc: No such file or directory エラー
    • htop を一度も起動していないために発生。htop を起動して終了し、sed を再実行
  4. メインの doom プロセスが死んでゾンビプロセスだけが残った場合
    • sudo pkill doom-htop を実行

改善点

  • 方向キーで移動すると htop の画面が動いてしまい不便
  • htop 起動後にフォーカスを変更することで対処可能(例: a キーを押してプロセッサ選択メニューを開く)

FAQ

  1. 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件のコメント

 
GN⁺ 2024-04-22
Hacker Newsの反応

このコメント群は、htopを使ってASCIIでレンダリングされたDoomゲームをプロセスとして動かすプロジェクトに対する反応をまとめたもの。主な内容は次のとおり。

  • PSDoomとの比較: PSDoomがDoomを使ってプロセス管理を行うのに対し、このプロジェクトはその逆で、プロセスマネージャーを使ってDoomをプレイする。
  • 技術的評価: ASCIIでレンダリングしてプロセス名に入れること自体はそれほど難しくないが、htopをレンダリングエンジンとして活用した発想が印象的で、ソフトウェアハックの真髄を示している。
  • 開発者の力量への敬意: こうしたプロジェクトを作る時間と能力がある開発者を見ると、自分の能力に自信をなくしてしまう。
  • Doom統合トレンド: これからはDoomに日常的なものを統合することも考えられそうで、ToDoリストやカレンダーなどが想像できる。
  • ハッカー精神への称賛: 楽しさのためのハッキングプロジェクトが人気を集めているのを見るとうれしく、ハッカー精神がまだ生きていることを示している。
  • Bad Appleを連想: Windowsのタスクマネージャーで実装されたBad Apple動画を思い起こさせる。
  • Doomの未来: 今後Doomがどこまで実装されていくのか想像しがたい。