オンラインゲームを作る (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年前

別にまわしものじゃないですが、この本とても面白いのでオススメ!興味ある人はGoto amazon

アバター
へろりくしょん
記事: 92
登録日時: 14年前

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

投稿記事 by へろりくしょん » 14年前

えっと、よく分かりませんが。 要約すると、私をとことんダメ人間にしたいという事でしょうか。

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

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

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

> へろりーな

名前が迷走してやいませんか(笑

それは興味あるってことですかい?
オンラインゲームの設計面白そうですね、それ用にサーバーも契約しちゃいましたし、突っ走りますよ♪

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

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

投稿記事 by ISLe » 14年前

同期式は一歩ずつ前へという考え方で
非同期式は何秒後かにはここにという考え方なんですけど、
海外のパソコンゲームはネットに繋がる前から非同期式の考え方で作られたものが多かったんですよね。
日本ではスプライトを搭載したハードウェアで作られたアーケードゲームが一世を風靡したために異なる文化を辿ることになったわけです。

(追記)
非同期式は、不整合は発生しない、という前提のシステムですよ。
不整合が発生しても救済しない、という言い方のほうが分かりやすい?
最後に編集したユーザー ISLe on 2011年6月26日(日) 17:15 [ 編集 2 回目 ]

アバター
SAI
記事: 115
登録日時: 14年前

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

投稿記事 by SAI » 14年前

オンラインゲームとな!?
花映塚龍神録ですね、わかります。

>敵が瞬間移動したり、ダメージを与えたのに与えなかったことになるなど不整合が生じる
これってモンハンそのままだw

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

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

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

> ISLeさん

> 不整合が発生しても救済しない、という言い方のほうが分かりやすい?

はい、そのつもりで書きました。
ただ、不整合が生じるのは致し方ないという書き方でした。
著者曰くお互いに遅延が発生して不整合が起きることは仕方がないから、
不整合が生じた時にはお互いに損が少ない方向に強制的に修正するよう書かれていました。
遅延がこれだけ生じるからには不整合が生じてしまうことは致し方ないですね。

サーバー側が状態を全て管理しているとレスポンが悪くなってしまうでしょうし、「完全な解」はないんですかね。
オンラインゲームやってても敵が瞬間移動したり、いない敵が居たりすることもありますし・・。

アバター
へろりくしょん
記事: 92
登録日時: 14年前

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

投稿記事 by へろりくしょん » 14年前

学生時代に、ネトゲにハマってしまい廃人寸前まで行った事があるのです。 ネトゲは人を廃にするゲームです。

ネトゲの仕組みについてはよく分かりませんので、適当ですが。
遅延によりユーザ毎が保持するデータがバラバラになるリスクを受け入れた上で、それに関しては無責任を貫くというスタンスを取る事を前提にすれば実装は大分楽になるんじゃないですか。
それだったら、ゲームの状態を集中管理出来るブラウザ型の方が簡単に出来るんじゃないかなとか思ったり。

今回の名前は、「へろりおーね」と「へろりーな」が最終候補に残りましたが、脳内評議会の投票により、へろりーなに決定致しました。
今後とも変わらぬご愛顧をお願い申し上げます。

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

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

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

> SAIさん
> 花映塚龍神録ですね、わかります。

ずっと前からボンバーマン(もどき)のオンライン対戦作りたかったんですよね~、まだ何を作るかは決まってないですが、
ボンバーマン(もどき)を作るなら、アクション性が必要になるので、設計が難しくなりそうです。
テラリア的なものなら、ある程度なんとかなるかも。

> これってモンハンそのままだw

あ~やっぱそうなんですね。
モンハンってアドホックですよね?アドホックでもそんな遅延あるのかぁ・・。

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

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

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

> へろりーな

何その私。
FF11を1万時間プレイした私にも完全に同じ事が言えます。。

> 遅延によりユーザ毎が保持するデータがバラバラになるリスクを受け入れた上で、それに関しては無責任を貫くというスタンスを取る事を前提にすれば実装は大分楽になるんじゃないですか。

強引かつ的確な(?)方法ですね。
アクションは辻褄合わせること無く端から実行してしまって、定期的に修正する方が良いのですかね。
ただその「辻褄合わせ」が非常に難しそう・・。
全てのデータを定期的に送信するとすごいデータ量になってしまいそう。
その辺はまだ勉強が必要そうです。

> 今後とも変わらぬご愛顧をお願い申し上げます。

次何になるか期待しておきますw

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

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

投稿記事 by TororoShinku » 14年前

モンハンフロンティアの通信は少し古いタイプで、
いまから新しくすることが難しいため、
そのままにしてあるみたいな事を聞いたことがあります。
ソースは俺です(笑