unity3d:网络模块优化:减少无用字段,降低字段精度,byte转vector3表示方向,心跳包优化,异步线程接收
2021/12/2 23:13:20
本文主要是介绍unity3d:网络模块优化:减少无用字段,降低字段精度,byte转vector3表示方向,心跳包优化,异步线程接收,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
网络模块优化方向
网络优化的目的是让网络包更小,响应更及时,消耗更少流量,不卡主线程。
减少无用字段
网络包中通常包含了很多信息,诸如角色位置,朝向,状态等。
如果是2.5D游戏,则位置z分量可以弃掉;朝向只在xz平面上,所以只需要发送RotationY。
通过这种减少无用字段,可以一定程度上降低网络包大小。
降低字段精度
能用byte的不用int。
通常逻辑里的很多信息都是4字节,包括角色位置,朝向,技能或Buff信息等。但很多时候,这些信息不可能达到4字节数的最大值,可以压缩至2字节甚至1字节。
比如,同样是位置,场景的尺寸通常在2字节数的表示范围内(-32512~32512),可以将位置的x/y/z压缩至2字节发送。同样地,朝向RotationY可以2字节表示。
2.5d游戏用byte转vector3节省网络流量
客户端给服务器,传输的是polynav2d寻路的角度,传输的是个byte值,因为角度360,即使只传输一半180,只损失2度的精度,但是可以只传输byte
服务器给客户端,需要一个gameobject进行转换,设置的是avatar相对于actor的角度
//vector2转服务器角度,相当于一个优化,传输byte, public static DIR_TYPE CalculateDirection(Vector2 dir) { float angle = Vector2.Angle(dir, Vector2.up); if (dir.x < 0) { angle = 360 - angle; } byte bdir = (byte)Mathf.RoundToInt(angle / 2); if (bdir == (int)DIR_TYPE.DIR_DEFALT) bdir = (byte)DIR_TYPE.DIR_NORTH; return (DIR_TYPE)bdir; } //角度换算,只为avatar,把人物的朝向角度转换为 avatar相对于父物体的偏转,先自身绕y轴转dir*2角度,再以Vector3.left为轴,转90度 private static Dictionary<int, Vector3> eulerDict = new Dictionary<int, Vector3>(); public static Vector3 GetEuler(DIR_TYPE dir) { int _dir = (int)dir; Vector3 val; if (eulerDict.TryGetValue(_dir, out val)) { return val; } else { if (dir == DIR_TYPE.DIR_NONE) { eulerDict[_dir] = Vector3.zero; return Vector3.zero; } //通过gameobject中转,把角度值转换为向量 GameObject tempObj = new GameObject(); Transform trans = tempObj.transform; trans.position = Vector3.zero; trans.localEulerAngles = new Vector3(0, _dir * 2, 0); trans.RotateAround(Vector3.zero, Vector3.left, 90); eulerDict.Add(_dir, trans.localEulerAngles); GameObject.Destroy(tempObj); return eulerDict[_dir]; } }
避免重复发送
游戏网络模块须有效限制部分协议在短时间内重复发送,例如玩家在短时间内按了很多次抽奖按钮。
所以需要一种机制来限制。比如可以在网络协议定义时,加个标记,表明该协议不能在某个时间段内重复发送。
心跳包优化
在网络中心跳机制会频繁发送接收,用来判定客户端是否离线。这里可以做个优化:例如发送协议后,10s没收到回包为断线了。在任何协议发送给服务器都等价于一心跳包定时器开启,在接到任何协议回包也等价于一个心跳包定时器关闭。如果在一定时间内一直没发协议,在5s时刻一直没发送协议,先发送一个心跳包开启定时器。
网络异步化
开辟独立的线程处理收发网络协议包,是游戏常见的优化手段,可以避免与主线程相互等待。
这篇关于unity3d:网络模块优化:减少无用字段,降低字段精度,byte转vector3表示方向,心跳包优化,异步线程接收的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享