オンラインマルチプレイヤーゲームの基本[終了]


9

現在、c#オンラインマルチプレーヤーゲームにリアルタイムで取り組んでいます。目的は、UDPプロトコルを使用してクライアント/サーバーベースの接続を確立することです。これまでのところ、サーバーに接続されているすべてのプレーヤーにデータが届くようにする必要があるため、プレーヤーの動きにはUDPを使用し、イベント(プレーヤーの射撃、プレーヤーの命を失う)にはTCPを使用しました。UDPは「信頼できない」と言われ、一部のパケットが失われる可能性があることを知っています。しかし、接続に影響を与える可能性があるので、TCPとUDPを混在させないようにあらゆる場所を読んでいます。

主な質問は、ネットワークをどのように整理すればよいかということです。

UDPはコネクションレスですが、誰が誰であるかをどのように保存すればよいですか?クライアントのIPアドレスをリストに保存する必要がありますか?

重要なイベントにTCPを使用するか、UDPを使用する必要がありますか?UDPを使用する必要がある場合、データが失われないようにするにはどうすればよいですか?

TCPとUDPの両方を使用することで、各プレーヤーのIPをリスト(UDPの場合)と別のリスト(UDPの場合)に接続されているTcpClientに保存する必要があります。どうすればより効果的に変更できますか?


@JoshPetrieこの質問は合法です。「主な質問は、ネットワークをどのように整理すればよいですか?」です。あれを使うべきかどうかは関係ありません。OPはそれを使用し、彼がすでに選択した別の技術を追加することについてのアドバイスを必要とします。答えはどのテクノロジーを使用すべきかではなく、基盤となるテクノロジーに関係なく、パイプの肥大化を回避し、遅延を減らし、信頼性を高めるためにソフトウェアをどのように構成できるかにあるため、答えは広範です。
コヨーテ

また、広すぎます。質問はより話題になるように編集してください(自由に編集してください、かなり古くなっています)。その後、再度開くことができます。

回答:


6

UDPはオーバーヘッドが少ないですが、知らないうちにパケットが失われるという犠牲があります(TCPのオーバーヘッドの一部は、失われたパケットが確実に再送信されるようにします)。

ただし、UDPを使用する際の大きな問題は、多くの管理者がそれが優れたセキュリティ対策であると信じているため、すべてのUDPトラフィック(DNSを除く)をブロックする多くのサイトがあることです。

また、すべてのプレーヤーが異なるIPアドレスを持っていると想定しないでください。複数のユーザーが同じインターネット接続を共有する多くの状況があり、学校の子供たちがあなたのゲームに夢中になったら、おそらく彼らは授業をする代わりに、授業中にそれをインストールして実行する方法を理解しようとしています(そして、他の誰かの代わりにゲームでこの貴重な時間を費やしているのではないでしょうか?)。

TCPストリームが開いても、それはまだかなり効率的です。次のステップは、送受信するデータの量を最小限に抑えることです。これがプロトコル設計の出番です。たとえば、同じコマンドを数百バイトのXMLコードでラップするのではなく、コマンドごとに数バイトだけ送信すると(たとえば、「進む」)、ネットワーク帯域幅全体の消費量が少なくなり、CPUサイクルが少なくなります。情報を処理するために必要です(数バイトは、XMLの大きなチャンクの解体と解釈および構文チェックと比較して簡単に比較できます)。

もちろん、複数のTCPストリームを開いて、コマンド用、グラフィック転送用、オーディオベースのチャット用など、さまざまな目的に使用できます。このようにして、5〜10を要する大きなグラフィックを転送する場合ダウンロードに数秒かかります。少なくともプレーヤーコマンドの動きは別のストリームにあるため、遅れることはありません(新しいスプライトのダウンロードが完了するまでデフォルトのスプライトを表示できます。これは常に待機するよりも楽しいです)。


1
元の質問ではクライアントサーバーモデルについて言及していたため、すべてのUDPをブロックする「サイト」は関係ありません。それがクライアントの問題です。多くのクライアントが実際にすべてのUDPをブロックしているのではないかと思います。「TCPの使用は、ネットワーク化されたゲームを開発する際に起こり得る最悪のミスです。理由を理解するには、TCPが実際にIPよりも上で何を行っているかを確認して、すべてがとてもシンプルに見えるようにする必要があります。」gafferongames.com/networking-for-game-programmers/udp-vs-tcp
indeed005

@ indeed005:これには長所と短所があります。UDPは確かにパフォーマンス上の利点を提供しますが、信頼性は犠牲になります(TCPの利点です)。UDPブロッキングに関しては、それがクライアントの問題であることは間違いなく正しいですが、多くの企業および教育環境で、UDPがセキュリティ問題であると考える無知な管理者によってブロックされているUDP(ポート53を除く)に遭遇しました。したがって、クライアントがTCPにフォールバックするオプションは、少なくともプレーヤーがゲームを体験できることを意味します(特にネットワーク帯域幅が十分に速い場合)。
ランドルフリチャードソン2011

@ indeed005:また、TCPは優先度の低いデータ転送に使用でき、UDPは高速アクション側に使用できるため、UDPとTCPの混合を使用してもまったく問題ありません。また興味深いことに、IPv6には利用可能な新しいオプションがあり(IPv4では利用できません)、本質的にコネクションレスではない一方で、ゲームのリアルタイムのニーズに応えることができますが、IPv6よりもしばらく前になると思いますIPv4に依存することなくゲームで利用できます(これは残念なことに、現時点ではできる限りIPv4を使用しています)。
ランドルフリチャードソン2011

3

これはあなたの質問に対する直接の回答ではありませんが、gafferongamesにはネットワークゲームに関するいくつかの本当に素晴らしい記事があります:http ://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about -ゲームネットワーキング/


リンクは:(破った
shieldgenerator7
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.