ターンベースのクライアントサーバーカードゲーム-ユニキャスト(TCP)またはマルチキャスト(UDP)


8

私は現在、クライアントがソケットを介して送信されるメッセージを使用してターンベースの同期的な方法でサーバーと通信するカードゲームプロジェクトを作成することを計画しています。私が抱えている問題は、次のシナリオの処理方法です。

(クライアントは順番を取り、そのアクションをサーバーに送信します)

  1. クライアントはサーバーにそのターンの動きを伝えるメッセージを送信します(たとえば、テーブルに置く必要があるその手からカード5を再生します)

  2. サーバーはメッセージを受信し、ゲームの状態を更新します(サーバーはすべてのゲームの状態を保持します)。

  3. サーバーは接続されたクライアントのリストを反復処理し、状態の変化を通知するメッセージを送信します

  4. クライアントはすべてリフレッシュして状態を表示します

これはすべてTCPの使用に基づいており、今見てみると、それはObserverパターンのように見えます。これが私にとって問題であるように思われる理由は、このメッセージが他のクライアントのようにポイントツーポイントではないようであり、すべてのクライアントに送信したいためであり、同じメッセージをそのように。

メッセージをすべてのクライアントに送信できるように、UDPでマルチキャストを使用することを考えていましたが、これは、クライアントが理論的に相互にメッセージを送信できることを意味しませんか?もちろん、同期の側面もありますが、これは私が推測しているUDPの上に置くこともできます。

基本的に、このプロジェクトは本当にすべて学習に関するものなので、何が良い習慣になるのかを知りたいと思います。これからパフォーマンスの問題が発生するほど大きくない場合でも、とにかく検討したいと思います。

ただし、メッセージ指向ミドルウェアをソリューションとして使用することに関心がないことに注意してください(MOMの使用経験があり、TCPソケットが不適切な場合はMOMを除く他のオプションを検討することに興味があります!)。

回答:


11

時期尚早に最適化しないでください。複雑にしないでおく。この場合、TCPを使用しても問題ありません。現在のスキームに問題はありません。

UDPは通常、TCPなどのストリームの抽象化レイヤーの上で作業するのではなく、個々のパケットを明示的に制御できるため、オンラインアクションゲームなどのパフォーマンスが重要なシナリオで使用されます。ただし、データの送信方法を正確に制御することで速度が向上しますが、UDPはTCPのようなパケット損失やパケットの順序付けを処理しません。その場合、自分でコーディングする必要があります。つまり、これはターンベースのカードゲームなので、速度よりも信頼性を犠牲にしたくないので、TCPを使用します。


あなたの答えをありがとう、それは明確で、私が尋ねたすべてに答えるように見えます。
LDM91 2012年

3

多くの大規模で人気のあるMMOでさえ、TCPのみを使用しています。それはあなたが必要とするすべての効率特性であなたが必要とするすべてを行います。

UDPにはさらに多くの複雑さが必要であり、マルチキャストにはさらに複雑が必要であり、それらから何も得られません。単に学習に興味があるだけなら、ぜひテクノロジーデモを自分でまとめてください。ただし、そのためにプロジェクト自体が改善されるとは思わないでください。

UDPを使用することに興味がある場合、最初のタスクは基本的にUDPの上にTCPを再実装することです。TCPが解決するすべての問題に対処する方法を実際に理解していることを確認するだけです。輻輳制御、失われたパケットの再送信、遅延複製処理、パケットの順序付け、信頼性の高い接続ハンドシェイク、信頼性の高い切断シーケンスなど

これらすべてを解決することは必ずしも難しいことではありませんが、ネットワーキング、IPプロトコル、およびそれらの問題の解決方法を深く理解する必要があります。

そこから、TCPに欠けている機能を提供するためにライブラリを構築することが、楽しみの始まりです。パケットストリームに多重化されたメッセージストリーム、より効率的な輻輳制御、レート制限処理、マルチチャネル、チャネル構成(チャネルが順序付けされたメッセージを必要とするかどうか、ドロップされたパケットが許可されるかどうかなど)などを使用する。

次の一連の記事を読むことをお勧めします。それは完璧ではなく、いくつかの非常に疑わしい主張(「ゲームでTCPを使用しない」で始まる)はナンセンスですが、その技術的な詳細は新しいネットワークプログラマーに役立ちます:http : //gafferongames.com/networking-for-game-プログラマー/ udp-vs-tcp /


1
その記事の冒頭で筆者は次のように述べています。「行う選択は、どのような種類のゲームをネットワーク化したいかに完全に依存します。この時点から、この記事シリーズの残りの部分では、あなたが望んでいると仮定しますアクションゲームをネットワーク化します。Halo、Battlefield 1942、Quake、Unreal、CounterStrke、Team Fortressなどのゲームを知っています。」
XiaoChuan Yu

ああ、それをスキミングして覚えていると同じくらい良かったことを確認するときに、それを逃しました。すみません。
Sean Middleditch、2012年

-1 「UDPを使用することに関心がある場合、最初のタスクは基本的にUDPの上にTCPを再実装することですそれは非常に間違ったIMOです。UDPを選択するためにUDPが実際に行うことを学ぶには、はるかに役立ちます。
o0 '。

@Lohoris:それは役に立たず、正確でもありません。UDPを使用した場合でも、順序が保証されたメッセージを送信する機能が必要です。保証されていないメッセージを順番に送信できる必要があります。グアンティドの順序が狂ったメッセージを送信できる必要があります。必要なすべての機能を実装する必要があり、テストが最も簡単なため、TCPのような動作から始めるのが最も簡単です。それだけでも、帯域幅の使用状況やレイテンシのより直接的な制御などの便利な機能を提供します。
Sean Middleditch、2012年

@seanmiddleditchが間違っています。同じゲームでUDPとTCPの両方を使用することに何の問題もないので、UDPを介した保証付き配信を実装する必要はありません。
o0 '。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.