- 「クライアント サーバー」または「ピア ツー ピア」またはその中間の何か: どのコンピュータがどのゲーム アクションに対して権限を持っているか。
ターンベースのゲームでは、通常、「サーバーが最終的な権限を持っているので、完了です」と言うのは非常に簡単です。リアルタイム ゲームでは、多くの場合、その設計から始めるのが最適ですが、遅延を追加するとすぐに、クライアントの動き/アクションが応答しなくなったように感じます。そのため、クライアントの入力がキャラクターやユニットにすぐに影響を与えてその問題を解決できるようにする「レイテンシの隠蔽」を追加し、クライアントとサーバーのゲーム状態が分岐し始めたときに調整の問題に対処する必要があります。10回のうち9回は問題なく、クライアントが影響を与えたオブジェクトを権限のある位置にポップまたはラープしますが、10回に1回はオブジェクトがプレイヤーのアバターか何かである場合であり、その解決策は受け入れられないため、開始しますいくつかのアクションに対する権限をクライアントに与えます。ここで、サーバー上の複数のゲーム状態を調整し、悪意のあるクライアントを介した潜在的な「不正行為」に自分自身を開放する必要があります.そのようなことを気にする場合. これは基本的に、すべてのテレポート/だまし/あらゆるバグ/チートが発生する場所です。
もちろん、「すべてのクライアントが「自分の」オブジェクトに対する権限を持っている」というモデルから始めて、不正行為の問題を無視することもできます (ほとんどの場合は問題ありません)。しかし、そのクライアントが脱落した場合、または「シミュレーションについていくのが少し遅れただけ」でさえ、ゲーム シミュレーションに大きな影響を与える可能性があります。遅れているクライアントが追いつくのを待っているか、クライアントが制御するゲームの状態が同期していないという形で、遅れている、またはパフォーマンスが低いクライアント。
すべてのプレイヤーが同じゲーム状態で動作していることを確認するための一般的な戦略は、(上記のモデルの 1 つを介して) プレイヤー入力のリストに単純に同意し、ゲームプレイ シミュレーションをすべてのマシンで同期的に実行することです。これは、シミュレーション ロジックが正確に一致する必要があることを意味します。一致しないと、ゲームが同期しなくなります。これは実際には、思ったよりも簡単で難しいものです。ゲームは単なるコードであり、同じ入力 (乱数ジェネレーターでさえも) が与えられた場合、コードはまったく同じように実行されるため、簡単です。そうでない 2 つのケースがあるため、より困難になります。(1) ゲーム シミュレーションの外でランダムを誤って使用した場合、および (2) フロートを使用した場合です。前者は、どの RNG がどのゲーム システムで使用されるかについて厳密なルール/アサーションを持つことによって修正されます。後者は、フロートを使用しないことで解決されます。(フロートには実際には 2 つの問題があります。1 つは、プロジェクトの最適化構成に基づいて動作が大きく異なりますが、それが解決されたとしても、異なるプロセッサ アーキテクチャ atm 間で動作に一貫性がありません、笑)。Starcraft/Warcraft および「リプレイ」を提供するすべてのゲームは、このモデルを使用する可能性が最も高いです。実際、再生システムを持つことは、RNG が同期していることをテストする優れた方法です。
非同期ソリューションを使用すると、ゲーム ステート オーソリティは、特定の頻度でそのステート全体を他のすべてのクライアントにブロードキャストするだけです。クライアントはそのデータを受け取り、それを自分のゲーム状態に叩き込みます (通常、次の更新を取得するまで単純化した外挿を行います)。ここでは、「udp」が実行可能なオプションになります。ゲーム状態全体を約 1 秒ごとにスパム送信しているため、これらの更新の一部を削除することは無関係です。ゲーム ステートが比較的少ないゲーム (クエイク、ワールド オブ ウォークラフト) では、これが最も簡単な解決策であることがよくあります。