1

私は現在、(「リアルタイムクライアントサーバーアプリケーションの例としての単純なマルチプレイヤーゲーム」割り当ての一部として)少数のプレイヤー(20人未満だと思います)向けの単純なペースの速いゲーム用のマルチプレイヤーゲームサーバーを作成しようとしています。私は、保証された配信を必要とするパケット (つまり、チャット メッセージ、ログインおよびログアウト要求、ping パケットなど) には TCP ソケットを使用し、最後に通過したパケットのみが重要 (例: ユーザー入力、ゲーム世界とオブジェクトの更新など)。

ここで、私のゲームの世界がどのように見えるかについて言及する必要があります。すべてのオブジェクト サーバー側には、id、role、および owner メンバーがあります。Id は基本的にクライアントの識別子であるため、オブジェクトの更新を送信すると、クライアント側でどのオブジェクトを更新するかがわかります。所有者は、オブジェクトの所有者に関する情報です。つまり、アクターを制御するプレイヤーです。プレイヤーが接続を失ったりログアウトしたりすると、孤立したオブジェクトを削除するために使用します。ただし、ほとんどのオブジェクトでは、この値がサーバーに設定されています。最後に役割は、オブジェクトがクライアントにとって重要かどうかを決定します。これは、ServerSide (サーバー側のゲーム ステート計算でのみ使用されるため、クライアントに複製する必要のないオブジェクトの場合)、RelevantToOwner (このオブジェクトは所有者にのみ複製されます。つまり、プレイヤーのプライベート インベントリは複製されません) に設定できます。全員にレプリケートする必要があります)、

ユーザーがログイン パケットを送信すると、空きスロットがあるかどうかを確認し、空きスロットがある場合は、世界をレプリケートします (現在の世界の状態を送信します - ServerSide または RelatedToList として設定された役割を持たないすべてのオブジェクト - もちろんクライアントがリストにある場合を除きます)そのオブジェクトに対して)。

次に、サーバー ゲームの状態更新ループを繰り返すたびに、まったく同じもの (全世界の状態) を送信します。

ユーザーがログアウト パケットを送信すると、ログインしているクライアントから彼を削除し、スロットを解放し、孤立したすべてのオブジェクト (このユーザーが所有者であったオブジェクト) をゲーム ワールドから削除します。

ここに私の質問があります:

  • このモデルはリアルタイムのマルチプレイヤー ゲームに適していますか、それとも私のやり方が間違っていますか?
  • 最初の世界の複製後に送信されるパケットの量を減らす方法はありますか (つまり、最後の反復以降に状態が変化したオブジェクトのみを更新します。私はそれを考えましたが、これまでのところ、このアプローチで 1 つの大きな問題に遭遇しました。 - 前の反復からの UDP パケットが失われ、オブジェクトの状態が後続の反復で変更されていない場合、オブジェクトはプレーヤー側で更新されません。)
  • 複数のオブジェクトの更新を 1 つのパケットにパックするにはどうすればよいですか (現在、1 つのオブジェクト/パケットを送信していますが、これは非効率的であり、おそらくひどく間違っています。
  • プロがどのようにそれを行うかを見ることができるように、単純なクライアント/サーバーゲームの実際の例 (ソースがあればいいでしょう) を教えてもらえますか? C++ または C がいいでしょうが、Java / C# / Python も問題ありません。
4

1 に答える 1

2

これは、あなたが話しているゲームの種類に大きく依存します-例:テキストベースのマックゲームでほぼ同じことをしています..私の更新は簡単で、到着時に部屋の詳細を送信します。変更時に、メッセージを送信して、人/物が来た/行ったことを伝えます。終わり。

UDP は、10 万以上の接続を処理する必要があるという理由だけで、ほとんどのオンライン ゲームが機能する方法です。多くの場合、プレイヤーがゲームで「ワープ」するのは、UDP の損失が原因です。あなたが20人をやっているなら、それを保証できるなら、tcpに固執することは役に立ちます。

彼らを全世界に送る必要がありますか?あなたの世界はゾーン/部屋でできていませんか? 通常、小さい方のエリアを送信します。また、たとえば、送信する必要があるオブジェクト内のデータの量にも依存します。プレーヤーが在庫を持っている場合、他のすべてのプレーヤーに特に要求しない限り、それを送信しても意味がありません-着用アイテム(ビジュアルゲームの場合は必要であるか、間違って描画されます)

最近の接続がはるかに高速になったからといって、一部の人々を考慮に入れるべきではないという意味ではありません. 更新のみを送信して、クライアントに独自の状態を維持させる必要があります。その後、ゾーンを変更してエリアをリロードすると、確実に同期されます。

オブジェクトの変更をパケットに詰め込むには、おそらく座標などの場所の変更と、人がアイテムを拾うなどの可用性を推測します。更新構造、item_id、update_type、update_values[] があれば、更新のチャンクを送信できます。

テキストベースまたは mmorg タイプを求めていますか? テキストベース Google tinymuck、または tinymush、tinymud と言えます。それは難しいです。古い EQ コードとすごいエミュレーターのいくつかを調べることができます..

于 2012-08-24T08:31:07.860 に答える