Unity客户端架构猜想
优秀的插件资源
工欲善其事必先利其器,好的东西,拿来主义
造轮子与拿来主义的决择(新造的意义,拿来主义的方便。有效性,方便性,高效性)
网络层框架
长连接:TCP+Protobuf (C#层,Lua层)
- 粘包、分包、大数据包处理(扩容)
- 序列化、反序列化
- 加密、解密 (AES,TEA=>XXTEA)
拓展内容项
- 短链接:Http+json
- UDP(kcp,ENet)
资源管理与加载
AssetBundle
tips:Shader的AB包处理,内置BuildIn的Shader考虑
XAsset,YoAsset
对象池管理
- PoolManager
消息事件系统
C#层委托,Lua层自做事件系统
UI框架
-
UGUI + MVC?
-
UI管理堆栈,参数bool 是否压栈操作
-
UI适配问题
定时回调任务
表格配置读取
- 基于lua热更,全部集中做lua的Table表格
自做工具导出(一键自动全部式,单文件式) json,lua,pb
- 基于C#热更,做Excel表格数据的Item类 根据Excel生成对应的表格结构类,根据类文件再生成对应的二进制文件,以及文件字段读取的方法
luban内容了解
音频管理
- 按钮类(Button,Toggle…)
- 背景音(长)
- 特殊播放(短)
- 声音的类型设置
- 声音播放的缓存使用
核心战斗
编辑器扩展
大多数为非编程人员提供便利操作
场景管理
ScenesManager
日志系统
- Console pro + 自做日志系统
多语言
聊天,文本显示
I2Localiazation插件了解
热更新
- tolua
- xlua(Xlua+InjectFix)
- ILRunTime
- HybridCLR
SDK接入
- 账号性SDK
- 功能性SDK
- 数据中心 客户端侧上报
自动化构建
-
自动打包脚本 安卓(GooglePlay要求AAB+PAD,国内应用商店apk)和iOS
-
Jenkins
使用 Jenkins 作为持续集成工具,跑在一台空闲的 WindowsServer 里,作为 Master 节点;
两台 Mac 作为 BuildServer,也就是 Jenkins 的构建节点 (Node);
每台 Mac 安装好编译所需的各种工具,包括 Unity,Xcode(编 iOS 包),Gradle(编 Android 包),Fastlane,Make等。
Jenkins Mater 使用 ssh 连接到 Mac 上,执行预先写好的 Makefile 跑起整个自动构建流程。
Jenkins 执行一次全新的、完整的构建流程(iOS)大概分为以下几个步骤:
- 从 SVN 拉取工程代码(source),策划配置文件(config),构建工具脚本(tools)以及打包脚本(deploy);
- 执行脚本把策划配置文件(xlsx)转成代码可读的 Lua 文件;
- 执行脚本调用 Unity 生成 AssetsBundle,以及后续资源相关处理;
- 执行脚本调用 Unity 生成 Xcode 工程;
- 执行脚本调用 Fastlane 进行 Xcode 工程的编译以及打包;
- 执行脚本把生成的 ipa 以及 manifest 上传到版本发布服务器。
项目优化
-
CPU方向
一、DC (DrawCalls) CPU调用底层图形接口
- Draw Call Batching 批处理,物体合并一个描绘来渲染
(1)Static Batching
(2)Dynamic Batching
-
纹理打包成图集,减少材质使用
-
尽量少的使用反光、阴影之类的效果,导致物体多次渲染
二、物理组件 (Physics)
-
合适的Fixed Timestep
-
尽量不适用网格碰撞器
性能优化角度,物理组件能少用则少用,不是不用
三、GC(Garbage Collect)
-
频繁GC会加重CPU的负担,GC是Mono运行时的机制,非Unity3D的引擎机制,GC针对Mono对象,管理Mono的托管堆
-
GC不是来处理引擎的assets(纹理、音效)的内存释放的,Unity引擎也有自己的内存堆,不是和Mono一起使用所谓的托管堆
-
引用类型分配到托管堆(类的实例,字符串,数组),int,float,struct值类型是分配到堆栈上而不是堆上,类实例,字符串,数组 关注对象
-
GC的触发时机
(1)堆内存不足自动调用
(2)编程人员手动调用
四、代码质量 代码检测 C#端 (PVSStudio),Lua端(?)C#和Lua 内存泄漏问题
-
GPU方向
-
内存方向
线上日志查询(错误,崩溃 。。。)
- Bugly
- 日志发送到服务器
- 自身日志系统的彩蛋查看
- Unity日志函数LogReceived+LogReceivedTread?