我目前正在为Unity游戏构建自己的网络代码(用于学习体验),而且我在“解码数据包”方面遇到了一些严重的延迟。
基本上,我有playerObject
将其位置数据(Vector3(x,y,z))作为JSON字符串发送到服务器,服务器将其发送回所有其他播放器。 / p>
事物的插座方面正在顺利进行。从创建数据包到收到数据包的延迟非常小。
但是当我们尝试取消JSON远程客户端的位置时,我是在我的客户端上发生了大量延迟:
Vector3 remotePos = JsonUtility.FromJson<Vector3>(_command.Substring(5 + _usernameLength));
Json字符串在字符串的开头有一个标识符,表示它是一个Position更新,后跟两个表示用户名长度的数字,然后是用户名(以便远程客户端可以更新正确的{{1整个字符串看起来像这样。
playerObject
从服务器收到此类数据包后,我的客户将执行以下任务:
POS09NewPlayer{"x":140.47999572753907,"y":0.25,"z":140.7100067138672}
所有这些“都有效”,但只有3个客户同时连接后才会变得非常缓慢。
我做错了什么?必须有一个重大缺陷,因为我只为每个.015秒发送3个玩家的更新,其中像战地这样的游戏可以为64个玩家每秒发送60个更新!
任何建议都将受到赞赏。
答案 0 :(得分:6)
嗯,肯定有优化的空间。由于您引用大型游戏引擎作为参考,我将根据较旧的虚幻引擎版本和他们正在使用的一些优化给您一些示例:
整件事情要比我在这篇文章中所能解决的问题复杂得多,但其主要内容可能是:网络带宽是多人游戏中最有限的资源,因此引擎不受限制地发送尽可能少的信息包,因为它可以逃脱。
注意什么?对于此引擎中的整个向量,位置向量的不到一个组件已经被认为太大了。我想JSON确实在这里引入了一些开销,仅仅是因为它的冗长。当你也可以发送它们的实际位并从实际包中推断它们的含义时,你将数字作为字符串发送。