マルチプレイヤーゲームのタイムステップ


8

サーバー/クライアントマルチプレーヤーエクスペリエンスを作成するというコンセプトに頭を悩ませています。

私の問題は主にタイムステップに関連しています。次のシナリオを検討してください。

クライアントはサーバーに接続します。クライアントは入力をサーバーに送信して、移動したいことを示します。サーバーは入力をシミュレートし、ゲームの世界におけるそのクライアントの位置を決定します。

クライアントとサーバーの両方が異なるタイムステップで実行されているため、すべてのクライアントがサーバーと同期するように正確にシミュレーションするにはどうすればよいですか?私のサーバーは現在30msのタイムステップに設定されています。クライアントの移動を処理するとき、潜在的に何百ものリクエストが処理されるのを待っていますが、各リクエスト間の時間を示す方法はありません。

すべてを同期させるために、時間に基づいてサーバー上で適切にシミュレートする方法を本当に理解していません。



3
あなたもこれらのリンクを試すことができます:ゲームネットワーキングのペースの速いマルチプレイヤー Gaffer
AshenBee

回答:


3

簡単に言うと、サーバーからの各スナップショットとクライアントからの各入力でタイムスタンプを送信する必要があります。

両端で、パケットが受信されないフレームを「埋める」プロセスが必要です。

私のゲーム(テンポの速いアクションゲーム-あなたのゲームは異なる場合があります)では、サーバーで "古い"(順序が正しくない)入力を破棄し、新しい入力パケットが到着しない場合は、同じボタンを推測します押したままにします(ボタンの短い押し/リリースを確実に処理するためのもう少し多くのものがありますが、それが基本的な前提です)。

クライアントでは、「ラグバッファー」を保持します(この記事ではTetradがリンクしています)。到着時間のローリング平均を使用して、ラグバッファーが適切な長さを維持するようにします。これにより、クライアントのゲームの実行が少し遅くなったり、速くなったりします。スナップショットが間に合わない場合は、クライアントで推定を行います。それ以外の場合は、バッファ内のスナップショット間を補間します。

また、クライアントは、入力の往復時間を追跡し、それを予測に使用します(サーバーは、所定のフレームを計算するときに使用した入力のタイムスタンプを送り返します)。これは、その時間の入力をバッファリングし、プレーヤーの位置を(サーバーからのスナップショット内の)「古い」位置から予測された「現在の」位置に移動するように再生します。

基本的に、サーバーは固定フレームレートで動作し続けます。クライアントとサーバーの同期を維持するかどうかは次のとおりです。

もちろん、これは単なる概要です。あります多くのあなたは、あなたがそれを実装する際に把握しなければならないことを核心ザラザラ詳細は。


サーバーが1つのサーバータイムステップの間にクライアントから10個の入力コマンドを受信した場合。サーバーは10個の入力コマンドを実行します。各入力コマンドをシミュレートする時間をどのように知ることができますか?入力コマンドを1つだけ受け取った場合、タイムステップの全期間にわたってコマンドをシミュレートしますか?
jgallant 2013年

1
@ジョンほとんどの「アクション」ゲームは、各フレームでボタンのアップ/ダウン状態として入力を送信します。次に、サーバは、同じように最新の受信状態を使用している更新ダニのための状態。ドロップされた、遅れた、順不同のパケットは無視されます。(少なくとも基本レベル-たとえば、シーケンス情報を追加して、ドロップした場合でも、非常に短いアップまたはダウン状態が無視されないようにすることができます。)これは、タイミングが関連付けられているすべての入力に対して行う必要があることです。 。コマンドベースのアクション(例:RTSの「ここに移動」)には、通常、関連付けられた期間はありません。そのため、それらを順番に実行するだけです。
Andrew Russell
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.