2

私が作る予定のゲームサーバーとクライアントでは、長い目で見れば処理しなければならないパケットが大量に発生します。さまざまなパケットを処理する方法のベストプラクティスは何だろうと思っています。

パケットのペイロードは PacketID で始まります。

Packet を拡張する別のクラスを作成し、そこでロジックを処理することは良い考えでしょうか? たとえば、Pac​​ket001Login? これにより、長期的には多くのクラスが得られます。

巨大なswitch 文を作成した方がよいでしょうか? 疑わしい。

私が思いつかなかった最善の方法はありますか?

どんなアドバイスでも大歓迎です。

4

1 に答える 1

2

サーバー側で十分な計算時間がある場合は、さまざまなパッケージ タイプのプロトタイプを作成する手法に取り組む必要があります

このポイントとアイデアを説明するために、UML のようなクラスの説明をいくつか示します。

UML:

class PacketPrototype
+ PacketPrototype(PacketType)
+ addData(DataType, Bitlength, ...)
+ deserilize(Bitstream stream) : ReceivedPacket
+ serilizeThis() : ToSendPacket
+ getPacketType() : int

また、すべての PacketPrototypes を持ち、各 PacketPrototype オブジェクトの Type を決定するクラスも必要です。どの Prototype を使用してデータをデシリアライズする必要がありますか。

すべての PacketPrototype を認識する 1 つのクラスが必要です。私はそれを PacketPrototypeHolder と呼んでいます

class PacketPrototypeHolder
+ register(PacketPrototype)
+ getPrototypeForPacketType(int Type) : PacketPrototype

セットアップ時のプロトコルは次のとおりです。

PacketEnemy00 = new PacketPrototype(0)
PacketEnemy00.addData(Types.Int, 5) // health
PacketEnemy00.addData(Types.String, 16) // name
...

これは、タイプ 0 のパケットが 5 ビット長の int と最大長 16 文字の文字列から構成されることを意味します。

セットアップ後に PacketPrototype を PacketPrototypeHolder に追加する必要があります。

PacketHolder.register(PacketEnemy00)

サーバーまたはクライアントがパケットのタイプを読み取る何かを受信した場合、それを行います ( Bitstreamからデータを読み取ることができます)

Type = Bitstream.readInt(5)
Prototype = PacketHolder.getPrototypeForPacketType(Type)

ReceivedPacket OfReceivedPacket = Prototype.deserilize(Bitstream)

// we need here a switch/if statement to determine how to handle the reading of the data
switch(Type)
{
  case 0: // PacketEnemy00

呼び出しはデータストリームからデータを読み取り、Prototype.deserilizeそれを ReceivedPacket オブジェクトに入れます。そこから、インデックス操作または名前付きアクセスを使用してデータにアクセスできます。

例として、私はインデックスでそれを行います

   int UnitHealth = OfReceivedPacket.getInt(/* index, we want the 1st int */0);
   string UnitName = OfReceivedPacket.getString(/* index, we want the 1st string */0);

   and so on...
   break;
   ...
}

そのため、switch ステートメントをネットワーク レイヤー内からアプリケーション/使用レイヤーに効果的に移動しました。

スイッチを削除するには、データ駆動型のアプローチが必要です。しかし、ハードコードされたアプローチよりも実現するのがエンジンの方が複雑です。

于 2013-07-17T20:41:12.283 に答える