Flash Wish .Netサーバー側でオンライン マルチプレーヤー ゲームを作成しています。通信がソケットを使用して行われるように、二重チャネルが必要です。
サーバーとクライアント間のデータ交換のプロトコル/形式に関するベスト プラクティスを教えてください。IMOの良い選択の1つは、JSONシリアライゼーションを使用している可能性があります。
Flash Wish .Netサーバー側でオンライン マルチプレーヤー ゲームを作成しています。通信がソケットを使用して行われるように、二重チャネルが必要です。
サーバーとクライアント間のデータ交換のプロトコル/形式に関するベスト プラクティスを教えてください。IMOの良い選択の1つは、JSONシリアライゼーションを使用している可能性があります。
私は、JSON が最良の選択であると考えています。その理由を説明させてください。
まず、JSON 表記は "name : val" のようなものであり、"<name> val </name>"
.
次に、JSON シリアライゼーションはゲームにとって最も直感的な方法です。XML および XML に似た表記は複数行のデータに適していますが、ゲーム内変数の値は通常かなり短く (HP、マナ、AP、ダメージなど)、1 行で記述できます。
第 3 に、Actionscript 3 (AS2 で MMO を作成しないことを願っています) には、JSON のデコード/エンコード用の完璧なツールがあります。XML 解析ツールも優れていますが、IMO、JSON の方が優れています。また、Flash 11 以降では、JSON 操作が非常に最適化されています。
第 4 に、多くの高負荷プロジェクトは MongoDB でキャッシュ サーバーを使用し、その主な形式は BSON (バイナリ JSON) であるため、この場合に JSON を使用すると、DB と他のすべての間のデータ通信が簡素化されます。
優れたソリューションは、完全なパフォーマンスとトラフィックの最適化を提供する独自のプロトコルです。
オンライン ポーカーに最適なプロトコルを探すために、さまざまなプロトコルを試しました。
研究の結果は、次のプロトコルです。
最初の 2 バイトはパッケージ タイプです。package の 2 番目の 2 バイトは、パッケージのサイズです。N バイトのパッケージ本体
場合によります。関連するテクノロジーについてはしばらく忘れて、特定の通信ニーズに集中してください。関連するいくつかの点についても調べていただいてもかまいません。
コードに何らかの同期コンテンツが必要な場合は、コードに応答フロー制御が必要になる場合があります。また、メッセージに ID があり、応答先の元のメッセージ ID がある場合がある何らかのメッセージング構造が必要になる場合があります。これにより、非同期プロトコルでもコンテンツを制御できます。この場合、@ JustLoginが述べたように、JSON のような保守が容易なプロトコルの方が適している可能性があります。
全二重とは、ネットワーク/インタープリター層でより多くのデータをステージングすることを意味し、おそらく非同期通信を処理する必要があります。
パフォーマンスが懸念事項であり、詳細にもよる場合は、@ Viacheslavのような提案が魅力的です。カスタム プロトコルは、保守性と移植性を犠牲にして大幅に最適化できます (いくつかの言語には独自の JSON インタープリターがありますが、カスタム インタープリターを実装またはカプセル化する必要があり、プロセスにレイヤーを追加してパフォーマンスを低下させたり、コード変換を必要としたりする必要があります。 )
パケットが 1 つまたは 2 つ失われても気にしない場合は、UDP が実行可能なソリューションになる可能性があります。TCP よりも制御が少ないということは、プロトコルが軽いことを意味しますが、独自の制御を実装しない限り、データが反対側に到達したことを確認することはできません。
TL;DR バージョン: 多少のオーバーヘッドが追加されたとしても、JSON のような標準の低レベル プロトコルに固執します。