舞台裏:依存関係ゼロのゲームサーバーを作った話
Webの開発に少し触れたことがあれば、あのジョークを知っているでしょう。モダンなプロジェクトの`node_modules`フォルダは銀河の写真より重い、というやつです。誰も正確に何をしているのか分からない外部ライブラリが何百と積み重なっています。Node.jsでゲームを開発する際、私たちは逆の道を選び、それが開発上の誇りの一つになっています。Dovionのサーバーは外部依存関係がゼロで動きます。ゼロです。起動時にサードパーティライブラリは一つもありません。
具体的に何を意味するか?
ゲームスタジオがオンラインゲームサーバーを構築する時、普通はすでにあるブロックを組み合わせます。WebSocket(ブラウザとサーバーのリアルタイム接続)のためのライブラリ、ファイル提供のためのライブラリ、これとあれのためのライブラリ、など。最初は素早い。
私たちはすべてを手で書きました。最も手ごわい部分も含めて。WebSocketサーバー自体——つまり、船の位置、射撃、イベントをリアルタイムでサーバーと各プレイヤー間で伝達するプロトコル。これは99%のプロジェクトが疑問を持たずにインポートするコンポーネントです。私たちは最後の1行まで理解することを選びました。
なぜこんなことをするのか?
(単なる)マゾヒズムではありません。この選択には非常に具体的なメリットがあります。
- 信頼性。 各依存関係はリスクです。すべてを壊すアップデート、サードパーティで見つかったセキュリティの脆弱性、作者に放棄されたプロジェクト。依存関係ゼロ=他から来る悪いサプライズゼロ。今日のサーバーは5年後も同じように起動します。
- 軽量さ。 中間層なし。コードは求められたことだけを正確に行い、それ以上でも以下でもありません。リアルタイムでルーム全体をシミュレーションしなければならないサーバーにとって——権威型サーバーの舞台裏で説明しました——各ミリ秒が重要です。
- 制御。 午前2時にバグが発生した時、そのバグは必ず私たちのコードの中にあります。他の誰かが書いたライブラリの内部を掘り探す必要はありません。すべてを構築したので、すべてを修復できます。
- デプロイが簡単。 サーバーのインストールは、ファイルをコピーして起動するだけです。パッケージのインストールも、バージョンの非互換性も、魔法の儀式も不要です。
ロックされたネットワークでのプランB
この制御が可能にする具体的な例:一部のネットワーク——学校、企業——はWebSocket接続をブロックします。多くのゲームでは、これが永遠に回転する接続画面になります。ネットワーク層全体を制御しているので、HTTP/SSEによるフォールバック通信を構築できました。WebSocketがブロックされると、ゲームは自動的にこの代替ルートに切り替え、それでもプレイできます。このような安全網は、ネットワーク層がインポートされたブラックボックスだった場合、はるかに構築が難しかったでしょう。
デメリット(ちゃんとあります)
正直に言います。この哲学にはコストがあります。時間です。他の人が1行でインポートするものを自分で書くと、何週間も余分にかかります。読むべき技術仕様書、処理すべき奇妙なケース。これは熱意あるスモールプロジェクトの贅沢です。商業的な締め切りを持つチームはおそらくこれを余裕にできません。これが全員に合った唯一の正しい方法だとは主張しません——これが私たちのやり方であり、私たちの規模に合っています。
この手作り哲学はサーバーを超えています。ゲームの世界自体もコードで描かれ、画像ファイルなしで——ジブリ風レンダリングの舞台裏で説明しています。全体的な結果:軽量で、素早く読み込まれ、非力なマシンでも動くゲーム——非力な設定でのDovionが証明します。
この目に見えない作業はすべてただ一つの目的のためです。あなたがクリックして、動くこと。自分で確認してみてください。Dovionを無料でプレイ