web-dev-qa-db-ja.com

TCPまたはマルチプレイヤーゲームのUDP?

これはよくある質問です。ほとんどの人は、TCPよりもUDPの方が常にリアルタイムゲームに適していると言っています。私の理解は、TCPは、UDPが気にしない一方で、反対側がそれらを取得するまで何度もパケットを再送信しようとすることです。

私が読んだことのほとんどは、UDPはすべてのリアルタイムゲームの必須要素であり、TCPはひどいものです。しかし、実際のところ、ほとんどの人はTCPであり、80年代ではなく、インターネットが非常に高速で信頼性が高いことを考えると、両者の違いは無視できると聞いています。

ここでの私の一般的な理解は間違っていますか?誰かがこれを片付けてくれますか?

19
flooblebit

ピアツーピア、サーバーを実行しているユーザーのクライアント/サーバー、またはサーバーを実行しているデータセンターのクライアント/サーバーのいずれであるかによって異なります。後者の場合にのみ、インターネットは本当に高速で信頼性があります。ユーザーのコンピューターはnotであることが保証されており、確実に信頼できるものではありません。

UDPを使用すると、TCPのような実装をより詳細に制御できます。順不同でパケットを実行したり、不要だと思われるパケットを破棄したり、重要だと思われるパケットを再試行したりするなどの柔軟性を提供します。ただし、これは、必要な場合、および必要な専門知識がある場合にのみ行う必要があります。

その柔軟性がなくてもできる場合は、TCPで十分に機能し、時間を大幅に節約できます。プロのスタジオ(私が働いていたスタジオなど)でもTCP =彼らが絶対にUDPを必要とせず、ネットワークプログラミングに専用の人々がいる場合。

12
Kevin Fee

@Ordousが指摘したように、「インターネットは今や非常に高速で信頼できる」と言うのは仮定であり、危険なものでもあります。

ほとんどのゲームで配信クリティカルパケットのUDP +カスタムプロトコルが魔法をかける理由は、一部のパケットを失うと "大丈夫"になる可能性があるためです(たとえば、ゲームのプレイを完了するための2次の非クリティカルイベント)。 、たとえば、カーソルの動きなどの一部のデータを失うことが「まったく大丈夫」ではない場合もあります(私は生活のためにゲーム開発を行っていないので、漠然とした例を許していません)。

UDPは、デフォルトでそれらを何度もプッシュするのに時間を無駄にしません。

また、多くのゲームでは、「常に確実に配信する必要がある」パケットよりも、「ときどき失われることがある」パケットの方が多いようです。したがって、このタスクに自然に適合します。

UDPで必要なのは、「常に必ず配信する必要がある」パケットを適切に配信するのに役立つカスタムプロトコルを使用することだけでした。残りのゲームデータはネットワーク接続のなすがままにしました。

次に、送信されるほとんどのデータを構成するトラフィックの種類を決定することで、より適切な決定が可能になります。

TCP=に対するポイントは、再試行に費やされた時間がむしろ重要なパケットの送信に費やされる可能性があるということです。

転送中に問題が発生した場合、TCPがユーザーのより詳細なゲームプレイシナリオにカスケードされ、UDP +カスタムスタック(これは最後の部分は単なる直感です。これについては、他の専門家に任せてコメントします。このシナリオの可能性について学びたいと思います)。

3
Naresh Kumar