我目前正在为Unity游戏构建自己的网络代码(为了学习经验),但是在“解码数据包”的过程中遇到了一些严重的延迟。
基本上,我有一个名为playerObject
的物体,它将其位置数据(Vector3(x,y,z))作为JSON字符串发送到服务器,并将其发送回给所有其他玩家。
套接字方面的事情进展顺利。从创建数据包到接收数据包的延迟非常小。
但是,当我的客户端试图对远程客户端的位置进行解析时,会出现巨大的延迟:
Vector3 remotePos = JsonUtility.FromJson<Vector3>(_command.Substring(5 + _usernameLength));
JSON字符串在字符串开头有一个标识符,表示它是一个位置更新,后跟两个数字表示用户名的长度,然后是用户名(以便远程客户端可以更新正确的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个客户端后变得非常缓慢。我做错了什么?肯定存在重大缺陷,因为我每0.015秒只发送3个玩家的更新,而像战地游戏这样的游戏可以为64个玩家每秒发送60个更新!任何建议将不胜感激。
JsonUtility.FromJson
移动到if
语句中。 - hyankov