2012-02-21 17 views
3

私は小さなオンラインのタイルベースのゲームを作成しようとしています。私はソケットとのゲームサーバー接続を確立しました。そのため、クライアントとサーバーの間でStringを簡単に送ることができます。Java MMOゲームのデータ転送

効率的にデータを転送できるようにするには、どのような形式でデータを保存すればよいですか?私は、データのオブジェクトを使用してシリアル化し、それを送信する必要がありますか? 1つの長い文字列にデータを格納する必要がありますか?それとも別の方法がありますか?

それは私が送信されるデータの種類重要ならば、それは、(他のプレイヤー、マップオブジェクトとなど

私は今、数日間閲覧されてきたが、まだ結果に関する情報となりますおそらく私はこの問題がどのように呼ばれているのか分からないからです)。

ありがとうございました!

答えて

4

ここで最も重要なことは、これがターンベースのゲームですか?

ターンベースのゲームの場合は、TCPソケットを使用して、ソケット全体で完全なゲーム状態(または以前のgamestateに基づくデルタ)を転送することができます。どのようにエンコードされているかは実際問題ではありません。

リアルタイムゲームでは、できるだけ頻繁に状態を更新することが重要です。パケットが失われてもそれは重要ではありません。多分、別のパケットが、前のパケットを上書きする、まだ転送中であるかもしれない。このため、TCPの代わりにUDPソケットを使用する必要があります。

タイルベースのゲームについて話していることを考慮して、クライアントにどのような情報を伝える必要があるか考えてみてください。残りは静的であるのに対して、プレイヤーだけが移動することはありますか?

これは単なる決定的な答えが得られない難しい問題です。メインのゲームシミュレーションループのデザイン、不正行為、ネットワークアーキテクチャのテストなどに触れることには、設計上の多くの決定事項があります。あなたが直面する問題の小さな例については、https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networkingを参照してください。

私はあなたを与えることができる最も簡単な解決策は以下のとおりです。

  • 使用TCPソケットあなたは、パケット損失を処理する必要はありませんので。
  • サーバー上でゲームの状態が変更されると、状態をすべてのクライアントに伝達します。たくさんの部屋を取らないものでこれを行います。一例は、以下のように小さなパケットを通信することである。ENTITY NUMBER - NEW POSITION。 (すなわち、2つの32ビット整数)。一度に複数のアップデートを通信する必要がある場合は、それらが同じTCPパケットに含まれていることと、TCP送信バッファが両端で即座にフラッシュされることを確認してください。
  • 往復(ping)時間が400ms以降のクライアントを扱うときに直面するすべてのタイミング問題を忘れてしまいます。必要であれば、パケットを次のように変換することができます。ENTITY NUMBER - NEW POSITION - CURRENT SPEED VECTORこれは、クライアントが遅延遅延を含むエンティティの位置を推定することを可能にします。
0

これはあなた次第です。 String、直列化、またはByteBufferにデータをパックし、ネットワーク経由で送信することができます。あなたに最も適した方法を選択してください。しかし、ByteBufferが最も効率的だと思います。

Nettyライブラリは、ソケット処理を大幅に簡素化するので、推奨します。