まず、ネットワーク モデルについて説明します。
私のゲームのネットワーキングは、リモート サーバーとクライアント上のオブジェクトのペアリングで構成されています。簡単に説明すると、サーバーの世界にはクライアントと同期する必要がある複数のキャラクターがいるとします (簡単にするために 1 つだけを考えます)。
サーバー側でキャラクターが作成されるたびに、サーバーは ServerRpgCharacter をインスタンス化します。このクラスは RpgCharacter をラップし、オブザーバーなどを登録してキャラクターを監視し、関連するミューテーションをキャラクターにブロードキャストします。次に、サーバーは ServerRpgCharacter のペア オブジェクトを要求します (つまり、サーバーと通信するこのオブジェクトのペアをインスタンス化するようにクライアントに要求します)。ペアは任意のクラスにすることができますが、リモート エンドで ServerRpgCharacter によってディスパッチされるすべてのメッセージは、クライアント側のそれぞれのペアによって受信されます。
複数のクライアントにもう少し関与しますが、うまく機能します。
とにかく、私はこのモデルを最適化する方法を複数考えてきました。現在の動作方法は、オブジェクトがそのペアにメッセージをディスパッチすると、「スナップショット」のキューに入れられるというものです。ペアになったエンティティがメッセージをディスパッチするたびに、同じスナップショットにスローされます。スナップショットは圧縮され、200 ミリ秒間隔で送信されます。
問題は、TCP/IP プロトコルを使用してこれらのスナップショットを送信していることです。TCP プロトコルがどのように機能するのか正確にはわかりませんが、スナップショットのパケットがドロップされた場合、スナップショット全体を再送信する必要があると思います。
したがって、TCP を破棄し、代わりに UDP のカスタム レイヤー オーバートップを実装すると、すべてのペアから送信されたすべてのメッセージに対して 1 つのスナップショット全体をディスパッチする代わりに、これらの個々のペアが独自のパケットを維持するようにすると、より最適になるのではないかと考えています。順序付けとバッファリング。このようにして、ペア A のパケットがドロップされた場合、ペア B は、ペア A のパケットがドロップされた場合に 1 つあったという事実を無視できます。
次に、このデータを圧縮すると、送信されるデータが少なくなるため、効率が低下することを考慮する必要があります。