なぜこれが難しかったのか
- Bashの速度問題: Bashは非常に遅く、ピクセルごとにコマンドを実行すると適切なフレームレートを実現できない。画面の状態をメモリ上に保持できず、配列や文字列へのアクセスにも時間がかかる。
- 数学的な制約: Bashは浮動小数点サポートがなく、数学関数ライブラリもない。すべての数学演算は整数で行われ、100000でスケーリングされる。
- ターミナルグラフィックの問題: ピクセルを表現するためにUnicodeの半ブロックを使用し、垂直解像度を2倍にしている。隣接ピクセルの色を知る必要がありながら、Bashには状態を保持する機能がない。
- その他の問題点:
- ターミナル全体を一度に更新することが難しい。
- ほとんどのターミナルはゲーム用ではなく、キーボード入力をリアルタイムで処理するのが難しい。
- ターミナルを色で塗りつぶすには大量のデータが必要。
- Bashは複数行の文字列を一度に出力しない。
- ECMA48、VT100、VT200、Xtermなどの標準規格は複雑で理解しにくい。
- 数学計算において困難があった。
FAQ
- Q: ウィンドウサイズを調整すると問題が発生する
- Q: CPUが過熱する、または古いコンピュータが遅くなる
- A: 環境変数
FPSを30未満に設定してみてください。
- Q: Bashバージョン5未満では動作しない
- Q: このコードは純粋なBashですか?
- A: いいえ。開始時に
sttyを呼び出してエコーを無効化し、終了時に再び有効化します。
1件のコメント
Hacker Newsのコメント
このゲームは実際には3Dではないので、各列ごとに一度だけレイトレースを実行してピクセルを描画する方法がとても巧妙
MS Batch で書かれたレイキャスターがあるかどうか気になるなら、GitHubリンクを参照できる
Bash は遅いので、スクリプト実行や対話型の用途には適していないと思う
stty がフォークを要求するのが惜しい
rowhammerを使って、フォークなしで必要なioctlを呼び出す方法を見つけられそうそれでもなおかなり遅いシェルを使うことが分からない
Bash でこんなことができるとは知らなかった
9年前の
awkレイキャスターも言及に値するこのプロジェクトを実行できなかったのは残念だ
bufferedというファイルに保存されて、すぐに終了してしまうコードが300行しかないのが印象的
この挑戦は本当にすごい