前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >unity3d:网络模块优化:减少无用字段,降低字段精度,byte转vector3表示方向,心跳包优化,异步线程接收

unity3d:网络模块优化:减少无用字段,降低字段精度,byte转vector3表示方向,心跳包优化,异步线程接收

作者头像
立羽
发布2023-08-24 15:18:00
2290
发布2023-08-24 15:18:00
举报
文章被收录于专栏:Unity3d程序开发

网络模块优化方向

网络优化的目的是让网络包更小,响应更及时,消耗更少流量,不卡主线程。

减少无用字段

网络包中通常包含了很多信息,诸如角色位置,朝向,状态等。   如果是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的角度

代码语言:javascript
复制
//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时刻一直没发送协议,先发送一个心跳包开启定时器。

网络异步化

开辟独立的线程处理收发网络协议包,是游戏常见的优化手段,可以避免与主线程相互等待。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 网络模块优化方向
  • 减少无用字段
    • 2.5d游戏用byte转vector3节省网络流量
    • 避免重复发送
      • 心跳包优化
      • 网络异步化
      相关产品与服务
      云服务器
      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档