オンラインゲームを作る (part.1)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

オンラインゲームを作る (part.1)

投稿記事 by Dixq (管理人) » 14年前

オンラインゲームの仕組みってどうなってるんだろう?
それは長きに渡って疑問に思っていたことでした。

昔LAN内で遊べるオンラインゲームもどきを作ったことあるのですが、
完全に遅延が無く、通信に障害が起きず、誰も切断しないという前提であり、誰か何か問題が起きると破綻する仕組みでした。

そこで、まずは先人の知恵を知ろうと、二つの本を読みました。

画像 これと 画像 これ

まず後者の本を300ページほど読んだ所なのですが、とても面白い!
土曜日曜と、ジュンク堂に入り浸って閉店まで読んでました(早く買って家で読めと)

前者の本は絶版なので、amazonで、後者の本は買って帰りました。

詳しいことは是非本を直接読んで欲しいのですが、現在読んで得たことを少し以下にまとめてみます。

============================================================================

オンラインゲームの仕組みには大きく分けて3通りある。

① 同期式

全てのプレイヤーが完全同期しており、それぞれがキーの入力状態を送り合って、それぞれのPCでシミュレートする。
全ての情報が揃うまで次のフレームの計算を行わない。

長所:実装が楽
短所:誰かの回線が遅いと全ての足を引っ張る

② 非同期式

それぞれのPC上で動作しているゲームの状態が異なることを認め、
一部不整合が生じても妥協して、定期的に全てのゲームの状態を強制的に合わせる。

長所:特定の回線に足を引っ張られることが無い
短所:実装が大変。敵が瞬間移動したり、ダメージを与えたのに与えなかったことになるなど不整合が生じる

③ ブラウザ式

多少遅延があっても問題ない種類のゲーム(RPG)で、全ての処理をサーバーで処理する。
クライアントはサーバーをブラウザする形でゲームを進行する。
MMOで利用されている。

長所:大きく遅延があっても整合性を常にサーバーが保っているので問題が起きない。
短所:通信量を最小限にする、操作頻度が低いゲームシステムにする、大きな遅延に耐えられるゲームシステム/設計にする必要がある。

============================================================================

本を読む前に私が作ろうとしていたのは「同期式」でした。
これはオンラインゲームの仕組みとして適切ではないと思っていましたが、本を読んで少人数であればアリかな?と思い、
実現可能性を検討してみることにしました。

まず、同期式で最も問題になるのは、「遅延」でしょう。
全てのデータが集まるまで次の計算をしないので、誰か一人でも遅い回線の人がいたら、全員のFPSが落ちてしまいます。
(30FPSで動作するゲームであれば、33[ms]以内に全ての計算を終える必要があります)

以下pingを使った遅延の測定結果をまとめてみました。
東京 - 東京  7ms
大阪 - 東京  19ms
札幌 - 京都  44ms
東京 - 東京  68ms(無線使用時)
東京 - 米国  163ms


距離があると遅延が増えていくことが見て取れますが、国内(札幌-京都)で既に33msを超えてしまっています。
無線は対象外にするとしても近くに住んでる人同士じゃないと遊べないんじゃダメですね。

筆者曰く、採用の基準として
025ms以内 → 同期式
100ms以内 → 非同期式
300ms以内 → ブラウザ式
を提案しています。
どうも非同期式を採用しないといけ無さそうです。

しかし、非同期式は「辻褄合わせ」が非常に難しそう。
次回の日記ではその辺について書いてみようと思います。
最後に編集したユーザー Dixq (管理人) on 2011年6月26日(日) 17:16 [ 編集 3 回目 ]

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: オンラインゲームを作る (part.1)

投稿記事 by Dixq (管理人) » 14年前

> Tororoさん

聞いたことがある = ソースは俺 はちょっと違いやしませんか(笑
昔から自社で持っている仕組みを使いまわしているということですね。
ということは今現在考えられるもっと良い仕組みがあるということでしょうか。
う~んこの辺は現役のプログラマー、デザイナーじゃないと難しそうですね。

ISLe
記事: 2650
登録日時: 14年前

Re: オンラインゲームを作る (part.1)

投稿記事 by ISLe » 14年前

対戦ボンバーマンは同期式じゃないと無理じゃないですかね。
対戦格闘ゲームとかは専用の高速回線でシステム組んでますよ。

モンハンとかハンターが直接他のハンターに影響を与えるようにはなってないですよね。
非同期式の場合、極端な話、オンラインで繋がっているクライアントが同時進行してなくても良いのですよ。
最終的に縦軸さえ合えば良いわけで、横軸が揃っている必要はないのです。
タイムパラドックスとかジレンマとかの話の好きなひとがシステム設計したら良いものができそうな気がします。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: オンラインゲームを作る (part.1)

投稿記事 by Dixq (管理人) » 14年前

> ISLeさん

ですよね~・・。
スト4ってオンライン対戦出来るじゃないですか、あれが出来てるんだから出来るだろうと思ってたんですが、
あれって対戦相手決める時に近い地域にいる人と合わせてるみたいですね。
遅延が影響するゲームを全国規模で実行するのは難しそうです;
同期式でも非同期式でも難しそうですね、ボンバーマンは。

無理やり同期式にするとして、遠くに住んでる人はごめんなさいするシステムだとすると私が真っ先にハミゴになりそうです・・(苦笑

ISLe
記事: 2650
登録日時: 14年前

Re: オンラインゲームを作る (part.1)

投稿記事 by ISLe » 14年前

Dixq (管理人) さんが書きました:あれって対戦相手決める時に近い地域にいる人と合わせてるみたいですね。
何のゲームだったか忘れましたけど、ロビーで対戦相手探すときにケータイのアンテナみたいに回線品質が表示されるのがあった覚えがあります。
プロバイダの組み合わせとかでわりと遠くても遅延がない場合があるらしいです。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前

Re: オンラインゲームを作る (part.1)

投稿記事 by MoNoQLoREATOR » 14年前

非同期型の場合、キャラクタの位置と押されているキーの情報、時間 を送受信すれば瞬間移動することはなくなりま・・・せんでした。まあ、少しはマシになると思います。

アバター
aquashooting
記事: 67
登録日時: 14年前

Re: オンラインゲームを作る (part.1)

投稿記事 by aquashooting » 14年前

オンラインゲームといえばHALOが思いつくけど
あれ作れたら最強ですね(笑)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: オンラインゲームを作る (part.1)

投稿記事 by Dixq (管理人) » 14年前

> ISLeさん

なるほど、今使ってるサーバーの遅延調べています。
結果見てまた考えてみようと思います。

> Monoさん

そうですね定期的にデータの同期は取らないといけないと思います。

> aquaさん

FPSゲームですか?
リアルタイム性が高いゲームはなかなか難しそうですね。

ISLe
記事: 2650
登録日時: 14年前

Re: オンラインゲームを作る (part.1)

投稿記事 by ISLe » 14年前

Dixq (管理人) さんが書きました:なるほど、今使ってるサーバーの遅延調べています。
結果見てまた考えてみようと思います。
既存のオンラインゲームでロビーはマッチング機能で、対戦相手を選ぶとP2Pになるものがほとんどだと思います。
なのでロビーに表示される回線品質は、ユーザー同士が直接接続したときのものです。
サーバーが遅くても対戦は快適にできる可能性十分あります。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: オンラインゲームを作る (part.1)

投稿記事 by Dixq (管理人) » 14年前

> ISLeさん

他の日記と被りますが、TCPで接続するのが一般的だと思っていたので、ポート解放の必要があることから、P2Pは想定していませんでした。
P2P形式になったとしても、リレーサーバーを使う予定でした。
ただリレーサーバーを使うと遅延が問題になりますね・・アクション性が高いゲームだとリレーサーバーは使えないかもしれません。