それは長きに渡って疑問に思っていたことでした。
昔LAN内で遊べるオンラインゲームもどきを作ったことあるのですが、
完全に遅延が無く、通信に障害が起きず、誰も切断しないという前提であり、誰か何か問題が起きると破綻する仕組みでした。
そこで、まずは先人の知恵を知ろうと、二つの本を読みました。


まず後者の本を300ページほど読んだ所なのですが、とても面白い!
土曜日曜と、ジュンク堂に入り浸って閉店まで読んでました(早く買って家で読めと)
前者の本は絶版なので、amazonで、後者の本は買って帰りました。
詳しいことは是非本を直接読んで欲しいのですが、現在読んで得たことを少し以下にまとめてみます。
============================================================================
オンラインゲームの仕組みには大きく分けて3通りある。
① 同期式
全てのプレイヤーが完全同期しており、それぞれがキーの入力状態を送り合って、それぞれのPCでシミュレートする。
全ての情報が揃うまで次のフレームの計算を行わない。
長所:実装が楽
短所:誰かの回線が遅いと全ての足を引っ張る
② 非同期式
それぞれのPC上で動作しているゲームの状態が異なることを認め、
一部不整合が生じても妥協して、定期的に全てのゲームの状態を強制的に合わせる。
長所:特定の回線に足を引っ張られることが無い
短所:実装が大変。敵が瞬間移動したり、ダメージを与えたのに与えなかったことになるなど不整合が生じる
③ ブラウザ式
多少遅延があっても問題ない種類のゲーム(RPG)で、全ての処理をサーバーで処理する。
クライアントはサーバーをブラウザする形でゲームを進行する。
MMOで利用されている。
長所:大きく遅延があっても整合性を常にサーバーが保っているので問題が起きない。
短所:通信量を最小限にする、操作頻度が低いゲームシステムにする、大きな遅延に耐えられるゲームシステム/設計にする必要がある。
============================================================================
本を読む前に私が作ろうとしていたのは「同期式」でした。
これはオンラインゲームの仕組みとして適切ではないと思っていましたが、本を読んで少人数であればアリかな?と思い、
実現可能性を検討してみることにしました。
まず、同期式で最も問題になるのは、「遅延」でしょう。
全てのデータが集まるまで次の計算をしないので、誰か一人でも遅い回線の人がいたら、全員のFPSが落ちてしまいます。
(30FPSで動作するゲームであれば、33[ms]以内に全ての計算を終える必要があります)
以下pingを使った遅延の測定結果をまとめてみました。
東京 - 東京 7ms
大阪 - 東京 19ms
札幌 - 京都 44ms
東京 - 東京 68ms(無線使用時)
東京 - 米国 163ms
距離があると遅延が増えていくことが見て取れますが、国内(札幌-京都)で既に33msを超えてしまっています。
無線は対象外にするとしても近くに住んでる人同士じゃないと遊べないんじゃダメですね。
筆者曰く、採用の基準として
025ms以内 → 同期式
100ms以内 → 非同期式
300ms以内 → ブラウザ式
を提案しています。どうも非同期式を採用しないといけ無さそうです。
しかし、非同期式は「辻褄合わせ」が非常に難しそう。
次回の日記ではその辺について書いてみようと思います。