2011-11-15 27 views
1

私は2人のプレイヤーがお互いにプレイできるターンベースのゲームを持っています。オンラインゲームにTCPを使用する必要がありますか?

これはC#で書かれており、XNA 4.0を使用しています。

現在、マルチプレイヤーはTCP/IPで実装されています。プレイヤーが同じネットワーク内にあり、そのうちの1人が相手のIPを知っている場合に限り、うまく動作します。

質問は次のとおりです。このゲームのオンラインプレイをどのように実装する必要がありますか? TCPは、IPアドレスとポート(または他の技術的な詳細)を扱わなくても、世界の反対側の2人のランダムプレイヤーを接続するための合理的な方法ですか?

この問題を解決するには、ゲームマッチングサービスをホストするサーバーがありません。 (まあ、私は私がIPアドレスを共有するため使用できる仮想Webサーバーへのアクセス権を持っている。)

が質問を一覧表示するには:

  • ん.NETは、TCPよりも通信方式のより良い選択を提供しますか?
  • 私の場合、NATを扱う最良の方法は何でしょうか?
  • 自分のサーバーを手に入れて、そこにサービスを提供するTCPゲームを実行する安価な方法はありますか?
+0

確かにTCPのファンです...これをProgrammers.SEに移行するには投票してください。 – Fosco

+1

私はgamedevがあればより適切だと言います。 –

+1

@Foscoなぜ移行しますか?これは、事実上のプログラミングの回答が利用可能な場合に問題になります。 – stefan

答えて

2

TCPとUDP。

TCPはUDPより少し遅いが、より多くのフェールセーフです。

あなたのゲームはターンベースであるため、おそらくクライアントとサーバーの間に最小限のデータ量しか送信されず、レイテンシに依存しません。

この問題を解決するには、ゲームマッチングサービスをホストするサーバーがありません。 (IPを共有するために使用できる仮想Webサーバーにアクセスできます)

プレーヤーにサーバーブラウザーなどを提供する場合は、サーバーを集中管理する必要がありますこのために作成されたスクリプト/アプリケーションを備えたWebサーバーはうまくいくでしょう。

  • 私自身のサーバーを取得し、そこTCPゲームマッチングサービスを実行する安価な方法はありますか?

Webサーバまたは同様のホストがうまく行うと、通常は安価であるだろう、何が欲しいのです:サーバリストに自分自身を追加するには、サーバー用

  • 機能。
  • クライアントがリスト上のサーバを検索する機能。 C#の持つWeb要求を行う

は全く問題ありません、要求のようなものになります:

http://www.example.com/addToServerList.php?name=MyEpicServer&ip=213.0.0.ABCを(リストにこのサーバーを追加します)

http://www.example.com/getOnlineServers.php(すべてのサーバのリターンリスト)

0

MinecraftはTCPを使用します。送受信されなければならないトラフィックに適していて、少し待ち合わせることができます。

+1

Minecraftは厄介なコードなので、例として使用すべきではありません。 –

+5

これは、TCPを使用する単なるゲームです。私はそれについて何も言わなかった。 – dataviruset

2

予想される許容負荷の種類を指定する必要があります。

一般的な答えは:リアルタイムのゲームのために

  • - UDP。

  • スクラブルのようなゲームの場合 - TCP。

あなたの言ったようにIPを共有するためにサーバーを使用してください。

+0

ターンベースであれば、私はTCPが正しいと思うと言うでしょう。 –

+3

@George:ターンベースのゲームでは、データに応じて、部屋に接続されたWebサービスなども考えられます。この方法でIPを共有する必要はなく、ファイアウォールをバイパスすることができます。 – stefan

+0

ターンベースのゲームでは、待ち時間を短くすることは優先事項ではありません。 私は、各ターンのデータを簡単に256バイトにまとめることができます。 しかし、私はWebサービスを使用する必要があります。プレイヤーはメッセージを頻繁にサーバーに照会する必要がありません。 DoS攻撃としてマークされているゲームの脅威はありますか? – Habba

0

UDPは片方向エラーチェックです。受信側のみがエラーをチェックします。これは、パケットをチェックするための往復が遅すぎる古い低速イーサネット技術では必要でした。

TCPは、ハンドシェイクを持つ非常に信頼性の高いプロトコルです。したがって、送信側は、データが正常に送信されるかどうかを知っています。しかし、ラウンドトリップのために、それは送信に多くのオーバーヘッドと遅延を与えます。

TCPもUDPを使用しないパケットを整理します。

いくつかのゲームは、パケットを失うことを気にしません(たとえば、オブジェクトが移動する場所のデータを「スチーム化」し、とにかく次回のパケットを更新します)。ここでUDPを使用できます。しかし、すべてのデータを取得することが重要でTCPではなく、すべてのデータが正常に送信されることを確認するためにコードを書くのに多くの時間を費やします。

ネットワークはすばやく十分です。インターネットはTCP/IPです。非常に低いレイテンシのトラフィックが本当に必要な場合を除いて、TCPを推奨します。 http://www.diffen.com/difference/TCP_vs_UDP

NAT:

このウェブサイトは良い要約を与える(TTL)を生きるためにあなたの時間と同じくらい長い間問題になることはありません十分な大きさです。 NATを取得するたびにTTLを1減算します。それが0であれば、それは落とされます。

+0

これは間違っています。第1に、UDPはTCPのように「ローレベル」であり、両方ともトランスポート層プロトコルである。第2に、両方とも 'チェックサム'フィールドを使用してエラーチェックを行います。 –

関連する問題