Javaでmmoゲームに使用する必要があるもの. UDPまたはTCP?なぜ?TCP はポイント ツー ポイントの関係であり、すべてのパケットを通過させますが、UDP にはポイント ツー ポイントの関係がなく、パケットを破棄して遅延を引き起こす可能性があります。このシナリオで使用するのに適したものはどれですか?
5 に答える
答えは言語ではなく、ゲームの要件によって異なります。
あなたのゲームがプレーヤー (またはサーバー) からのステータスの更新に対応できる場合は、行方不明になったり、順不同で到着したりしますが、UDP は問題ありません。
最小限の遅延でリアルタイムの応答が必要な場合 (および上記の問題が解決されている場合) は、UDP も使用する必要があります。
それ以外の場合は、TCP を使用する必要があります。
Java であるかどうかは関係ありません。TCP と UDP には、言語に関係なく、同じ長所と短所があります。
しかし、多くの場合、それは 1 つの基本的な設計上の問題に要約されます。つまり、パケットがドロップされた場合、何が起こるべきかということです。
- それは決して起こらなかったふりをします。これはUDPテリトリーです。
- パケットが再送されるまで待ちます。これは、TCP を使用する必要がある場所です。
どちらのアプローチもそれ自体が正しいとか間違っているということではありません。どちらもゲームに問題を引き起こしますが、これは最初に答えるべき質問です。
この質問を参照してください:
UDP と TCP に関する私の経験は次のようなものです。
- UDP は大幅に高速です。私たちは2桁の話をしています。
- 有線ネットワークでは、UDP パケット損失は 1% 未満です
- ワイヤレスでは、UDP パケット損失は簡単に 80% に達する可能性があり、ルーターまでの物理的な距離が重要です。1 フィート離れた場所では 20% のパケットが失われ、20 フィート離れた場所では 50% のパケットが失われます。
したがって、UDP は重要でないものに適しています。たとえば、ゲーム内で 2 人の男が走り回っていて、プレーヤー A が 100 ミリ秒ごとに UDP を介してプレーヤー B の現在の座標と速度を受け取った場合、プレーヤー A はあまり離れずにしばらく推定できます。一方、プレイヤー A がフルハウスで、プレイヤー B がロイヤル フラッシュを持っている場合、状況は異なります。
私のプロジェクトでは、主要な通信方式として UDP を使用し、すべての受信者が通知を送り返しました。ただし、X より長く通信が失敗した場合は、TCP に頼りました。
質問は実際にはJavaにリンクされていません。UDP データグラムは宛先に到達することが保証されていませんが、TCP データグラムは保証されています。連続した UDP データグラムも、順不同で宛先に到達する可能性があります。たとえば、DNS は UDP に基づいています。これは、要求と応答が 1 つのデータグラムだけを取るためです。信頼性が必要で、再試行を実装したくない場合。TCP を選択します。現在、コンピューティングのオーバーヘッドは最小限に抑えられているため、UDP を優先することでパフォーマンスが大幅に向上するとは思えません。