10

ゲーム内で絶えず変化するゲームオブジェクトのプロパティを同期するためにパケットを送信したいと思います。サーバー側でプロパティが変更されたときの通知を、クライアントが使用する更新の送信を担当するEntitySyncオブジェクトに送信しました。

現在、プロパティ文字列名を事前に固定しています。これは、多くの更新(位置、HP、角度)を送信する場合のオーバーヘッドが大きくなります。これらのパケットを識別するための半ユニークな方法が欲しいのですが。

属性(リフレクション...遅い?)について考え、最後にサフィックスを使用してそれをID(Position_A、HP_A)として送信しましたが、これらのプロパティを低い足ですばやく識別するためのクリーンな方法がわかりません。印刷します。できるだけ少ないバイトを消費する必要があります。

アイデア?

4

2 に答える 2

6

チャーリーの説明を拡張すると、

Marc Gravell によって作成された protobuf-net ライブラリは、シリアル化に関してまさにあなたが探しているものです。明確にするために、これは Google ではなく、Marc Gravell のライブラリです。Google のプロトコル バッファ エンコーディングを使用します。実際、手動でシリアル化するよりも小さいパケットを生成する可能性があります (デフォルトの Unity3D がネットワークを処理する方法、yuck )。

速度に関しては、Marc はいくつかの非常に巧妙な策略 (つまり、HyperDescriptors) http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces をすべてに使用しますが、実行時のリフレクションのオーバーヘッドを取り除きます。

ネットワークの抽象化に関する考察の材料。Rx http://msdn.microsoft.com/en-us/data/gg577609.aspxを見てください。イベント ストリームは、これまでネットワークとマルチスレッド サブシステム内通信を扱ってきた中で最も洗練された方法です。

// Sending an object:
m_eventStream.Push(objectInstance);

// 'handling' an object when it arrives:
m_eventStream.Of(typeof(MyClass))
.Subscribe ( obj =>
{
    MyClass thisInstance = (MyClass) obj;
    // Code here will be run when a packet arrives and is deserialized
});
于 2012-12-19T05:23:09.210 に答える
1

ネットワーク経由で送信するためにオブジェクトをシリアル化しようとしているようです。完全なプロパティ名をネットワーク経由で送信するのは効率的ではないことに同意します。これは、必要以上に多くのバイトを消費します。

この目的のためだけに Google が発明した本当に素晴らしいライブラリを使用してみませんか。

これは .NET ポートです: http://code.google.com/p/protobuf-net/

簡単に言えば、各プロパティが一意の ID を持つように送信するメッセージを定義して、プロパティをより効率的に送信できるようにします。

SomeProperty = 12345

次に、プロパティの ID とその値を送信するだけです。また、値の送信方法を最適化するため、値の大きさに応じて 1、2、3 バイトなどしか使用しない場合があります。本当に賢いです。

于 2012-12-10T08:20:27.673 に答える