11

リアルタイム ゲーム サーバーとクライアント (World Of Warcraft や Quake III など) を複数の言語 (Java バックエンド サーバーと iPhone フロントエンドなど) で作成する方法を提供する、優れた汎用バイナリ ネットワーク プロトコル定義フレームワークを探していました。 Objective-C と Cocoa で書かれたクライアント)。

Java Flash クライアント、iPhone クライアント、および Windows 上の C# クライアント (および XBOX 上の XNA クライアント) をサポートしたいと考えています。

TCP/IP または UDP ソケット ストリーム接続を介してメッセージを効率的に送受信する方法を探しています。JSON や XML マーシャリング オブジェクトなど、HTTP Web サービス経由で送信できるものを探しているわけではありません。Hessian のバイナリ Web サービス プロトコルは非常に興味深いソリューションですが、

クライアントがサーバーに接続し、定義されたプロトコルでメッセージを送信し、ある種の RPC エンドポイントにバインドすることなくプロトコルでメッセージを受信できるようにする、ネットワーク プロトコル形式とクライアント/サーバーの基本的な実装が必要です。プロトコルの着信および発信のメッセージの汎用ストリームが必要です。これは、サーバーがすべてのクライアントにゲーム内のさまざまなエンティティの位置を 100 ミリ秒ごとに送信するようなことをサポートできるようにするためです。

4

9 に答える 9

15

私が見つけたネットワーク プロトコル フレームワークは次のとおりです。

  1. Google のプロトコル バッファ- ただし、特定のプロトコルから任意のメッセージを送受信するなどのサポートが不足しています。
  2. Apache Thrift - 興味深いオプションですが、クライアントまたはサーバーがクライアントの RPC 要求に応答するだけでなく、いつでもメッセージを送信できる一般的なゲーム クライアント/サーバー ソケット タイプの接続ではなく、主に RPC を対象としています。
  3. Raknet Multiplayer - Raknet は完全なマルチプレイヤー ネットワーク ライブラリを提供します (収益が 25 万ドル未満のインディー開発では無料です)。

更新: OculusVR は RakNet とその Free/OpenSource を取得しました。UはGithubで見つけることができます

  1. Hessian Binary Web Service Protocol - HTTP Web サービス バイナリ プロトコルであり、添付ファイルでプロトコルを拡張する必要なくバイナリ データを送信するのに適しています。

Raknet は、優れたゲーム/シミュレーション指向のマルチプレイヤー ライブラリを提供します。

Apache Thrift と Google のプロトコル バッファは、ゲーム ネットワーク プロトコル クライアント/サーバー アーキテクチャで使用する最も簡単な方法のようです。

Hessian は、 COMETのようなある種のサーバー プッシュ テクノロジを使用して、Java またはフラッシュ クライアントで Web ベースのゲーム サーバーを作成する場合に最適です。Hessian は、Web 上でリアルタイム ゲームをサポートする非常に興味深い方法を提供し、Google の App Engine や Amazon の EC2 などの VM Web ソリューションでそれらをホストすることさえできるかもしれません。

ゲームやその他の用途にさまざまなプロトコル定義フレームワークを使用することについて、いくつかの議論があります。

于 2009-05-06T22:50:42.943 に答える
2

DIS

于 2009-05-28T17:56:09.663 に答える
1

複数のプラットフォームと言語に本当に関心がある場合は、エンディアンの問題を考慮してください。この用途向けに設計されたバイナリ プロトコルは、ネットワーク バイト オーダーを使用する必要があるため、データ型ごとのカスタム シリアル化関数が必要です。C 構造体をやみくもにネットワーク バッファーにプッシュすることはできません。

ゲーム会社におけるこの問題の一般的な解決策は、プロトコル記述言語または仕様を XML や python または lua のような単純な形式で用意し、データ構造とシリアライゼーションの両方を備えたパケット クラスを生成したターゲット言語ごとにコードを生成することです。この仕様では、基本的な型から始まり、意味情報、列挙型、またはより複雑な構造を持つゲーム固有の型を含むように拡張する型システムを使用できます。たとえば、データ ファイルは次のようになります。

Attack = {
  source = 'objectId',
  target = 'objectId',
  weapon = 'weapon::WEAP_MAIN',
  seed = 'int'
}

これにより、次のようなコードが生成される可能性があります。

#define PT_ATTACK 10002

class PacketAttack : public Packet {
  public:
    PacketAttack () : m_packetType(PacketAttack::s_packetType) {}

    ObjectId m_source;
    ObjectId m_target;
    WeaponType m_weapon;
    int m_seed;

   bool Write(Stream* outStream) {
       Packet::Write(outStream);
       outStream << m_source;
       outStream << m_target;
       outStream << m_weapon
       outStream << m_seed;
   }

   bool Read(Stream* inStream);

 static const int s_packetType;
};

これには、さらにいくつかのインフラストラクチャが必要です..ストリーム、パケット基本クラス、安全なシリアル化関数..

于 2009-05-29T16:46:29.220 に答える
1

独自のプロトコルを作成するルートに進む場合は、私がここに投稿した回答を読むことをお勧めします。

要約すると、プロトコルを作成する際に考慮すべきことについて説明し、バージョン管理と後方互換性と前方互換性を維持するためのいくつかのトリックをリストします。

于 2009-05-26T19:44:23.343 に答える
0

「単純な区切り文字列アプローチでロールする」には同意しません。質問は、正確には何がメリットになるのかということです。より多くのコードを記述して維持するようになりましたか?私が見ることができた唯一の理由は、ツールのサポートの欠如(いくつかの奇妙なプラットフォーム用の書き込み)、または特定の(非常に)ハードなパフォーマンスまたはメッセージサイズの制約です。または、時には、本当にフォーマットを書きたいと思っています-それは大丈夫ですが、それは明白な理由でなければなりません。

正確なニーズに応じて、JSONは任意のメッセージを読み書きできるため、JSONを検討することをお勧めします。Java用の優れたオブジェクトバインダー(xmlと同様)があり、バイナリ形式よりも読みやすく、多くのユースケースで「十分」です。

メッセージサイズが非常に重要な場合、Protobufはうまく機能します-そのサイズはgzip圧縮された代替手段(gzip + xml、gzip + jsonは非常にうまく圧縮されます)ほど小さいとは限りませんが、通常は近いです。

于 2009-05-06T18:34:04.930 に答える
0

Bill K の提案に同意したいと思います。独自のプロトコルを展開するのは難しくありません。

iPhone 側については、組み込みの区切り文字ベースの TCP パケットをサポートするAsyncSocketを見てください。パケット ヘッダーを使用するソリューションを構築することは難しくありません。

iPhone で AsyncSocket と対戦するテストサーバーがすぐに必要な場合は、デリミタ ベースのパケットとヘッダー付きのパケットの両方の準備ができているNaga (Java サーバー部分) を見ることができます。Naga は、ネットワーク ゲームを念頭に置いて部分的に作成されました。

于 2009-04-29T23:03:11.007 に答える
0

さまざまな言語を使用したい場合と、クリーンで小さいものが必要な場合があるため、Google のプロトコル バッファをお勧めします。RPC のプリコンパイル部分が必要ですが、異なる言語を混在させる場合は、それが最適なオプションだと思います。リンクは次のとおりです: http://code.google.com/apis/protocolbuffers/docs/overview.html

于 2009-05-23T14:57:21.160 に答える
0

UDP を直接実装しないのはなぜですか? あなたの質問は、主にあなたが望まないことについて言及しています..UDPの上にさらにどのような形の抽象化が必要ですか? Quake III のソースコードをダウンロードして、UDP 経由でゲームの更新をフレーム化する方法を確認してください。

IP プロトコルは複数のデバイス/OS を統一的にサポートするように設計されていますが、これはあなたが求めているものではありませんか? 膨大な範囲のシステムに実装されているプロトコルはどれですか?おそらく IP?

于 2009-05-26T19:38:36.490 に答える