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

なぜこれが難しかったのか

  • Bashの速度問題: Bashは非常に遅く、ピクセルごとにコマンドを実行すると適切なフレームレートを実現できない。画面の状態をメモリ上に保持できず、配列や文字列へのアクセスにも時間がかかる。
  • 数学的な制約: Bashは浮動小数点サポートがなく、数学関数ライブラリもない。すべての数学演算は整数で行われ、100000でスケーリングされる。
  • ターミナルグラフィックの問題: ピクセルを表現するためにUnicodeの半ブロックを使用し、垂直解像度を2倍にしている。隣接ピクセルの色を知る必要がありながら、Bashには状態を保持する機能がない。
  • その他の問題点:
    • ターミナル全体を一度に更新することが難しい。
    • ほとんどのターミナルはゲーム用ではなく、キーボード入力をリアルタイムで処理するのが難しい。
    • ターミナルを色で塗りつぶすには大量のデータが必要。
    • Bashは複数行の文字列を一度に出力しない。
    • ECMA48、VT100、VT200、Xtermなどの標準規格は複雑で理解しにくい。
    • 数学計算において困難があった。

FAQ

  • Q: ウィンドウサイズを調整すると問題が発生する
    • A: Issueを開いてください。
  • Q: CPUが過熱する、または古いコンピュータが遅くなる
    • A: 環境変数FPSを30未満に設定してみてください。
  • Q: Bashバージョン5未満では動作しない
    • A: はい。
  • Q: このコードは純粋なBashですか?
    • A: いいえ。開始時にsttyを呼び出してエコーを無効化し、終了時に再び有効化します。

1件のコメント

 
GN⁺ 2024-12-22
Hacker Newsのコメント
  • このゲームは実際には3Dではないので、各列ごとに一度だけレイトレースを実行してピクセルを描画する方法がとても巧妙

    • 空、草、実体オブジェクトを描画するために必要な回数だけ「このピクセルを描いて1行下へ進む」という文字列を繰り返してターミナルへ出力している
    • 制約のある別の環境向けにボクセルレンダーエンジンを検討しており、このプロジェクトで有用なものを見つけられそう
  • MS Batch で書かれたレイキャスターがあるかどうか気になるなら、GitHubリンクを参照できる

  • Bash は遅いので、スクリプト実行や対話型の用途には適していないと思う

    • 一部の人気 Linux ディストリビューションでも Bash をスクリプトシェルとして使っていない
  • stty がフォークを要求するのが惜しい

    • 次のプロジェクトでは Bash と rowhammer を使って、フォークなしで必要な ioctl を呼び出す方法を見つけられそう
  • それでもなおかなり遅いシェルを使うことが分からない

    • ほとんどのアプリは stdout と stderr に書き込めば済むので、テキストをもっと速く画面へ出力できるはず
  • Bash でこんなことができるとは知らなかった

    • Bash が得意だと思っていたが、この実装は驚くべきものだった
    • 数学的な理解が足りないが、見ていて楽しい
  • 9年前の awk レイキャスターも言及に値する

    • GitHubリンクで確認できる
  • このプロジェクトを実行できなかったのは残念だ

    • 理由は分からないが、ビューが buffered というファイルに保存されて、すぐに終了してしまう
  • コードが300行しかないのが印象的

    • このプロジェクトは気に入った
  • この挑戦は本当にすごい

    • できるなんて信じられない