私は現在、(ゲーム体験を学ぶための)ユニティゲームのための自分のネットコードを構築しています。私は物事の「デコードパケット」側で深刻な遅れに走っています。マルチプレイヤーゲームでは、効率的に位置データをソケットに送信する方法はありますか?
基本的には、自分の位置データ(Vector3(x、y、z))をJSON文字列としてサーバーに送信し、サーバーはそれを他のすべてのプレイヤーに送信します(playerObject
)。
物のソケット側はうまく動きます。パケットが作成されてからパケットが受信されるまでの遅延はごくわずかです。
しかし、彼らは非JSONへのリモートクライアントの位置をしようとしているとき、私はは私のクライアントの大規模な遅延を取得しています:
Vector3 remotePos = JsonUtility.FromJson<Vector3>(_command.Substring(5 + _usernameLength));
JSON文字列がに、文字列の先頭に識別子を持っています位置の更新であり、次にユーザー名の長さを示す2つの数字、次にユーザー名(リモートクライアントが適切なplayerObject
を更新できるように)が続きます。
POS09NewPlayer{"x":140.47999572753907,"y":0.25,"z":140.7100067138672}
int _usernameLength = Int32.Parse(_command.Substring(3, 2));
string _username = _command.Substring(5, _usernameLength);
Vector3 remotePos = JsonUtility.FromJson<Vector3>
if (_username != username)
{
playerDict[_username].transform.position = remotePos;
}
この「作品」のすべてを、ちょうど3のクライアントが同時に接続した後、非常に低迷取得します。
私は間違っていますか? 3人のプレイヤーに対して0.115秒ごとに更新情報を送信しているので、重大な欠陥が存在しなければなりません。バトルフィールドのようなゲームでは、64人のプレイヤーに対して60個のアップデートを送ることができます。
アドバイスをいただければ幸いです。
少なくとも 'JsonUtility.FromJson'を' if'内に移動します –
私はこのケースでこのような巨大な影響を引き起こす可能性が非常に高いです。 – Evk
@Evk json'dパケットを数えながら受信パケットを数えています。私は約3倍の速さでパケットを受信しています。つまり、物事は後ろに落ちる。 – MrDysprosium