2009-08-25 8 views
41

私はこれらのタイプのゲームでプロトコル(およびゲームループ)がどのように機能するかに興味があります。任意のポインタや洞察力が評価されます。StarcraftやAge of Empiresなどリアルタイム戦略ゲームのプロトコルはどのように見えるのですか?

私は、メインループは毎秒数 "ティック"進んだ世界状態を持っていると思いますが、プレイヤーのコマンドはどのように実行されますか?どのようなデータを前後に移動する必要がありますか?

答えて

88

私はこれについて多くの詳細を知ることができますが、最初に "1500射手" http://www.gamasutra.com/view/feature/3094/1500_archers_on_a_288_network_.phpと読んでください。これは多くの質問に答えます。ここに要約があります: まず、ゲームのリアルタイム性質のために、ほとんどのゲームはUDPを使用します。

  1. 読み取りネットワークデータ
  2. クライアント側の予測を行うと、ネットワークが あなたのオブジェクトが実際にネットワークが言うごまかすために物理学と
  3. 混乱べきであると言うところと比較:ゲームループは次のようなものが見えますあなたの 地元のゲームの状態が
  4. は、あなたがこの フレーム(どちらかといえば)
  5. をレンダリングなかったものに基づいて戻ってネットワーク上にデータを送っているものと

これは非常に簡素化されており、「物理的な面倒」は200ページの本を簡単に作成できますが、何かがある可能性のあるクライアントサイドを予測し、オブジェクトが存在していなければなりませんでした。そして、それらの値を何らかの形で補間して、オブジェクトが実際にどこにも気付かれていないと思われるところに「十分に近い」ように見せます。これは一人称シューティングでは超重視ですが、リアルタイム戦略ではそれほど重要ではありません。

リアルタイム戦略の場合、通常、ターンベースのシステムがあります。このシステムでは、時間はターンという控え目のチャンクに分割され、順番に発生し、それぞれのターンには単調関数によって生成された数値が重複のない特定の注文。任意のターンnにおいて、各クライアントは、ターンn + mで意図されたアクションを有する他のすべてのクライアントにメッセージを送信する。ここで、mは通常はかなり小さい任意の数であり、試行錯誤およびプレイテストによって最良に決定することができる。すべてのクライアントが意図したアクションを送信すると、各クライアントはturn n + mで送信されたすべてのアクションを実行します。これは、ユーザーがアクションを注文したときと実行するときに、アクションが微妙に遅れることを招きますが、通常これは目立つものではありません。

時間を曖昧にするために使用できるいくつかの手法があります。たとえば、ユニットをハイライトしてから移動するように指示した場合、移動を開始すると音が鳴り、実際には移動しません。しかし、そのユニットを移動させる意図のネットワークメッセージは、スクリーンがプレイヤーの入力に応答するときにすぐに送信され、ネットワークメッセージは既に送信され、確認応答されている。マウスのクリックとゲームオブジェクトのレスポンスの間に小さな遅延(100ms程度)を導入することで、それをさらに見せかけることができます。これは通常プレイヤーには気付かれませんが、100msはLANゲームの永遠であり、家庭内のコンピュータでブロードバンド接続しても、平均的なpingはおそらく15-60ms前後です。動き。

送信するデータには、決定的なデータと非決定的なデータの2種類があります。決定論的行動はゲーム物理学に根ざしているので、行動が開始されると、その行動の結果を予測できることが100%保証されます。このデータは、最初の状態に基づいてクライアント上で何が決定されるので、ネットワーク全体に送信する必要はありません。すべてのクライアントで同じシードの乱数ジェネレータを使用すると、「ランダム」イベントが確定的な振舞いに変わることに注意してください。非決定論的データは、通常、ユーザ入力であるが、多くの場合、ユーザの入力がどのようであるかを予測することが可能である。リアルタイムストラテジーゲームにおけるこれらのペアは、非決定論的なイベントが私のゲームオブジェクトの1つに何らかの秩序であるということです。ゲームオブジェクトが移動するよう命令されると、移動する方法は100%確定的です。したがって、ネットワーク上で送信する必要があるのは、オブジェクトのID、与えられたコマンド(帯域幅を節約するために列挙します)、コマンドのターゲット(存在する場合)です。アフェットのエリアであるが、移動コマンドは終了先を有する)。ユーザーが100回クリックして1つのユニットを移動させると、同じ一般的な領域にあるため、クリックごとに別々の移動コマンドを送信する必要はありません。帯域幅。

コマンドとその実行の間の遅延を処理するための最後のトリックは、ローカルパーセプションフィルタと呼ばれるものです。注文があった後に私が移動注文を受け取った場合、ユニットが動いていなければならないことを知り、その最終目的地を知っています。ユニットを瞬間移動させるのではなく、移動を遅くして物理学を混乱させることで、速度を少し上げて、その位置に追いつくことができます。正しい場所に保管してください。あなたがそれをスピードアップするために必要な正確な値も相対的なものであり、プレイテスティングは正しい値を決定する唯一の方法です。弾丸やミサイルを発射しても同じことができますし、それは非常に効果的です。これがうまくいくのは、特にオブジェクトが直接に向かっている場合やオブジェクトから離れている場合に、微妙な動きの変化を見ることが人間がひどく良いことではないということです。

次は、帯域幅を減らすことです。動いているユニットを見たり操作したりできなかったメッセージをクライアントに送信しないでください。ユーザーがクリックするため、同じメッセージを繰り返し送信しないでください。即時の影響がないイベントに対しては、すぐにメッセージを送信しないでください。最後に、受信に失敗した場合に失効する予定のイベントに対する確認を要求しないでください。私が動きの更新を取得しなかった場合、その更新を再送するときにその値は古いものになり、関連性がなくなるため、別の動きを送信してローカルの認識フィルタを使用して追いつくか使用する方が良いでしょう動きを補間してより正確に見えるようにするための3次スプライン(cubic spline)です。しかし、「あなたが死んでいる」、「あなたの旗が取られた」などの重要なイベントは、必要に応じて確認して再送信する必要があります。私はDigipenでネットワークゲームのプログラミングを教えていますので、おそらく答えを提供することができるので、これに関する他の質問を自由にお聞きください。ネットワークゲームのプログラミングはかなり複雑になる可能性がありますが、最終的には、実装の選択と選択の結果の理解についてです。

+7

自分のような非ゲーマーでさえ、面白い読書+1。 – JonnyD

3

Wesnothのバトルをご覧ください。

http://www.wesnoth.org/

これは、無料、オープンソース、そして全く素晴らしいです。あなたはその掘り出し物から多くを学ぶことができます。

+2

これはターンベースのようだから、どのくらいそれが助けになるかわからない。 私はそれをチェックアウトします、ありがとう! – JOrik

3

帝国ネットワークアーキテクチャの時代の議論here

IMHO、ピア・ツー・ピア重複リプレイベースのアーキテクチャのそのスタイルが印象的ですが、何のための行き止まりのビット以上8かそこらの選手。

関連する問題