1987年のようにゼロからビデオゲームを書く
作るもの
- Xプロトコルの第11版は1987年に誕生した。
- X11はGPUが登場する前のモデルであり、今日のハードウェアとはあまり相性が良くない。
- すべてのUnixシステムにはXサーバーがあり、macOSやWindowsでもGUI Linuxアプリケーションを実行できる。
- X11プロトコルは比較的シンプルで、ソケットを作成するだけで始められる。
- 2Dアプリケーションであれば、GPUとやり取りする必要なく動作できる。
認証
- 前回の記事では認証なしでXサーバーに接続していた。
- 今回はX認証プロトコルをサポートしている。
- これは、XWaylandを使う一部のデスクトップ環境では認証が必要だからである。
MIT-MAGIC-COOKIE-1 メカニズムを使って認証を処理する。
ウィンドウを開く
- UNIXドメインソケットを開いてXサーバーと通信する。
- X11ハンドシェイクを通じてサーバーとの接続を確立する。
- グラフィックスコンテキストを作成し、ウィンドウを生成する。
- ウィンドウを表示するために
map_window 呼び出しを使う。
アセットをロードする
- ゲームに必要な画像を読み込み、X11の画像形式に合わせて変換する。
- Pixmapを作成し、画像をアップロードした後、必要な部分をウィンドウにコピーする。
GN⁺の意見
- X11のシンプルさ: X11プロトコルは比較的シンプルで、ソケット経由で直接通信できる。これは初級エンジニアがネットワークプログラミングとGUIの基本概念を理解するのに役立つ。
- 最適化の可能性: Pixmapのようなオフスクリーンバッファを使えば、画像を一度だけアップロードし、その後は高速にコピーできる。これは性能最適化の良い例である。
- Odin言語の利点: Odin言語は、メモリ管理のような複雑な作業を簡単に処理できる機能を提供する。これにより効率的なプログラミングが可能になる。
- レガシーシステムのサポート: この方法は古いシステムでも動作しうる。さまざまな環境でソフトウェアを実行する必要がある場合に有用である。
- 学習リソース: X11のような低レベルプロトコルを直接扱うことは、GUIの内部動作を理解する上で大いに役立つ。これはエンジニアのスキル向上に貢献しうる。
1件のコメント
Hacker Newsのコメント
最初のコメント: 1987年のPCは1〜2MBのRAMを搭載しており、Super NESは128KBのRAMを搭載していた。Microsoftのプログラムよりはるかに小さいサイズの実行ファイルを作っていた。リンク
2番目のコメント: X11は古いが、ゲーム開発に必要な基本機能だけ実装すれば、残りは気にする必要がない。Xlibを使えば、より簡単に作業できる。
3番目のコメント: DOS PC向けのマインスイーパークローンをTurbo Pascalで開発した。大きなレベルで再帰アルゴリズムの問題に悩まされ、開始位置を安全に選べる機能を追加した。
4番目のコメント: 1987年にゲームを開発するのは、現代よりはるかに大変だった。DOSはマルチタスクをサポートしていなかったため、作業フローは非常に非効率だった。リンク
5番目のコメント: Godotエンジンのwasmファイルサイズが最低50MBあることにがっかりした。特にシンプルな2Dゲームでは最適化が必要だ。全体としては印象的だった。
6番目のコメント: Odin言語に興味を持った。OdinはZigと同様にメモリアロケータを関数に渡すが、より簡単に扱える仕組みを備えている。
7番目のコメント: Windows 3.1のマインスイーパーにはチートコードがあった。特定のキーの組み合わせを入力すると、安全なマスと爆弾のあるマスを見分けられた。
8番目のコメント: SDLのようなライブラリを使えば、オーバーヘッドはほとんどなく、さまざまなOSをサポートできる。レガシーなSDL 1.xを使えば、古いLinuxバージョンもサポート可能だ。
9番目のコメント: Simon TathamのMinesのWindows実行ファイルサイズは約180KiB。リンク