ネットワーク ゲームでのクライアント/サーバー通信のプログラミングについて一般的な質問があります。私は TCP をプロトコルとして使用し、通信は ... 機能しますが、それが効率的な方法であるかどうかはわかりません。
一般に、クライアント側で発生するアクションは、次のすべての手順を実行します。
- なんらかのアクション (例: ファイアボールがキャストされる)
- [*]このアクションでは、文字列を定義しました (例: #F#270#130#。これは、「F」が火の玉であることを意味し、270 は (たとえば) 角度、130 - の速度を表します)。撃つ火の玉)
- 文字列は Client と WaitingQueue の outputpuffer に入ります
- 文字列が送信されます
- サーバーが文字列を受け取る
- [*] サーバーには、文字列の意味を検出できるラインインタープリターが必要です (ここでは、F の意味は何ですか? これは火の玉です!) & コマンドを受信したクライアントに基づいて、一意の ID を追加します。
- [*] サーバーは、発生したアクションに基づいてロジックを計算する必要があります (火の玉は誰かにダメージを与えるか、誰かに (すぐに) 命中するか、最初に飛んでいくか?)
- サーバーは、すべてのクライアントに発生するアクションの (更新された) 文字列を送信します。(例: 何らかの理由で火の玉の速度が遅くなった可能性があります - ここに更新された文字列があります (#F#12345#270#90# - 12345 は一意のプレイヤー ID です)
- クライアントは文字列を受け取ります
- [*] クライアントは文字列をコマンドに解決し、それを処理します (アニメーション シーケンスを起動します...)
- 最初にコマンドを送信したクライアントは、受信した文字列をwaitingqueue内の文字列と比較します - 等しい場合は何もしません(一部のアクションをスムーズにするため、そうでなければ接続の問題/遅延により、一部のアクションが2回発生するか、pingに基づいて場所から場所へジャンプします
これらすべての手順を実行する必要は本当にありますか? [*] でマークされたすべてのステップで、コマンドごとに新しいラインインタープリター/アクションを定義する必要があるため、各アクションをクライアント側とサーバー側で 2 回コーディングしています。シリアル化可能なオブジェクトの送信について何かを読みましたが、一般的には考え方は同じようです。オブジェクトを送信し、それを解釈して処理する必要があり、オブジェクトを送り返します...
ヒントはありますか?より少ないコーディングで、コミュニケーション全体をよりエレガントに解決するには? またはもう少しソート - さまざまなアクションのこれらすべての #F# #M# #H# タグにより、ますます複雑になっています :)
(実際、私は実際に次のハンドラー/アクションを持っています:
-move -look/rotate -hpchange -firearrow -spawn/disconnect ...)
私が言いたいことを理解していただければ幸いです - 私はそのようにコーディングを続けることができ、何とか機能することを知っていますが、それはあまりにも複雑に思えます.
ありがとう!