EOC项目分析笔记1¶
项目优化列表¶
-
[ ] UI生成的view文件,这里执行比较浪费效率,有可能无用的节点也会Find transform 节点
方案:使用C#属性的方式去处理,只有使用的时候才get,能有效的减少无用节点的使用 -
[ ] 字符串拼接问题,使用公用
StringBuilder进行处理
using System.Text;
using Sproto;
namespace Skyunion
{
public static class StringBuilderCache
{
private const int MAX_Size = 512;
private static StringBuilder s_Cache = new StringBuilder(MAX_Size, MAX_Size);
public static StringBuilder Get(int capacity = 0)
{
if (s_Cache.Capacity < capacity)
return new StringBuilder(capacity);
s_Cache.Length = 0;
return s_Cache;
}
}
}
-
[ ] 所有new 数组的地方建议使用公共方法去管理,或者组成一个共有池
-
[ ] 所有使用
Physics.RaycastAll和Physics.Raycast的地方修改成无GC的方法
public static int RaycastNonAlloc(Ray ray, RaycastHit[] results, float maxDistance, int layerMask)

- [x] 对比字符串查找业务对象和id查找业务对象耗时及HashCode获取业务对象
方式1:
点击gameObject 根据GameObject的name字符串查找对应的业务对象
方式2:
初始化gameObject时添加一个组件,组件内有id字段,点击gameObject时根据gameObject上的组件找到id,然后根据id找到对应业务对象
方式3:
点击gameObject,根据gameObject的HashCode找到对应业务对象
对比耗时:
使用800000个gameObject测试:

方式1的耗时:重命名gameObject+通过字符串查找业务对象; 耗时 503+316 毫秒 方式2的耗时:给gameObject添加组件+通过id查找业务对象; 耗时 3883+191 毫秒 方式3的耗时:gameObject获取HashCode+通过HashCode查找业务对象;耗时 34+12 毫秒
结论:
gameObject的HashCode查找效率最高,其次是字符串查找,添加组件绑定id的方式最慢
- [ ] UGUI 优先使用RectMask2D,最后使用Mask
登录流程¶
设置登录信息,并且派发登录事件(开发模式)
设置登录信息,并且派发登录事件(线上模式)
链接服务器
连接服务器后进行重定向,再次连接服务器,并且验证;重定向且验证后表示登录成功
登录成功后获取角色列表

获取角色回调后后使用第一个角色

使用第一个角色进行登录,登录角色服
发送: SprotoType.Role_RoleLogin

收到登录角色服的回调,返回角色信息



内城初始化¶
地图初始化¶

相机位置初始化¶
相机参数初始化



相机视野变化和同步视野到服务器¶
监听
WorldCamera.Instance().AddViewChange(OnWorldViewChange);
*发送给服务器相机移动的消息public void SendMapMove(long x, long y)*
FogSystemMediator.cs(300):WorldCamera.Instance().AddViewChange(OnMapViewChange);
GlobalViewLevelMediator.cs(553):WorldCamera.Instance().AddViewChange(OnWorldViewChange);
MapUIiconMyCityMediator.cs(175):WorldCamera.Instance().AddViewChange(OnWorldViewChange);
PVPGlobalMediator.cs(468):WorldCamera.Instance().AddViewChange(OnWorldViewChange);
WorldMgrMediator.cs(312):WorldCamera.Instance().AddViewChange(OnWorldViewChange);
MainInterfaceMediator.cs(724):WorldCamera.Instance().AddViewChange(OnWorldViewChange);
WorldPanelMediator.cs(96):WorldCamera.Instance().AddViewChange(OnWorldViewChange);
地图单位初始化¶
初始化添加单位及更新单位数据
相机视野改变,调整单位

单位资源加载
public static void WorldMapViewObjFactory.SysLoadWorldObj(MapObjectInfoEntity data, string prefabname, Action<GameObject, MapObjectInfoEntity> callback)
public void WorldMgrMediator.OnLoadMapObj(GameObject go,MapObjectInfoEntity data)
地图地表及装饰物初始化¶
public void ReadMapBriefDataFromFile2(string map_data_path, int server_x, int server_y, Action action = null)



