私は現在、(「リアルタイムクライアントサーバーアプリケーションの例としての単純なマルチプレイヤーゲーム」割り当ての一部として)少数のプレイヤー(20人未満だと思います)向けの単純なペースの速いゲーム用のマルチプレイヤーゲームサーバーを作成しようとしています。私は、保証された配信を必要とするパケット (つまり、チャット メッセージ、ログインおよびログアウト要求、ping パケットなど) には TCP ソケットを使用し、最後に通過したパケットのみが重要 (例: ユーザー入力、ゲーム世界とオブジェクトの更新など)。
ここで、私のゲームの世界がどのように見えるかについて言及する必要があります。すべてのオブジェクト サーバー側には、id、role、および owner メンバーがあります。Id は基本的にクライアントの識別子であるため、オブジェクトの更新を送信すると、クライアント側でどのオブジェクトを更新するかがわかります。所有者は、オブジェクトの所有者に関する情報です。つまり、アクターを制御するプレイヤーです。プレイヤーが接続を失ったりログアウトしたりすると、孤立したオブジェクトを削除するために使用します。ただし、ほとんどのオブジェクトでは、この値がサーバーに設定されています。最後に役割は、オブジェクトがクライアントにとって重要かどうかを決定します。これは、ServerSide (サーバー側のゲーム ステート計算でのみ使用されるため、クライアントに複製する必要のないオブジェクトの場合)、RelevantToOwner (このオブジェクトは所有者にのみ複製されます。つまり、プレイヤーのプライベート インベントリは複製されません) に設定できます。全員にレプリケートする必要があります)、
ユーザーがログイン パケットを送信すると、空きスロットがあるかどうかを確認し、空きスロットがある場合は、世界をレプリケートします (現在の世界の状態を送信します - ServerSide または RelatedToList として設定された役割を持たないすべてのオブジェクト - もちろんクライアントがリストにある場合を除きます)そのオブジェクトに対して)。
次に、サーバー ゲームの状態更新ループを繰り返すたびに、まったく同じもの (全世界の状態) を送信します。
ユーザーがログアウト パケットを送信すると、ログインしているクライアントから彼を削除し、スロットを解放し、孤立したすべてのオブジェクト (このユーザーが所有者であったオブジェクト) をゲーム ワールドから削除します。
ここに私の質問があります:
- このモデルはリアルタイムのマルチプレイヤー ゲームに適していますか、それとも私のやり方が間違っていますか?
- 最初の世界の複製後に送信されるパケットの量を減らす方法はありますか (つまり、最後の反復以降に状態が変化したオブジェクトのみを更新します。私はそれを考えましたが、これまでのところ、このアプローチで 1 つの大きな問題に遭遇しました。 - 前の反復からの UDP パケットが失われ、オブジェクトの状態が後続の反復で変更されていない場合、オブジェクトはプレーヤー側で更新されません。)
- 複数のオブジェクトの更新を 1 つのパケットにパックするにはどうすればよいですか (現在、1 つのオブジェクト/パケットを送信していますが、これは非効率的であり、おそらくひどく間違っています。
- プロがどのようにそれを行うかを見ることができるように、単純なクライアント/サーバーゲームの実際の例 (ソースがあればいいでしょう) を教えてもらえますか? C++ または C がいいでしょうが、Java / C# / Python も問題ありません。