Unity架构猜想

「猜想」规划

Posted by MagicianJoker on April 2, 2020

Unity客户端架构猜想

优秀的插件资源

工欲善其事必先利其器,好的东西,拿来主义

造轮子与拿来主义的决择(新造的意义,拿来主义的方便。有效性,方便性,高效性)


网络层框架

长连接:TCP+Protobuf (C#层,Lua层)

  • 粘包、分包、大数据包处理(扩容)
  • 序列化、反序列化
  • 加密、解密 (AES,TEA=>XXTEA)

拓展内容项

  • 短链接:Http+json
  • UDP(kcp,ENet)

资源管理与加载

AssetBundle

  • 打AB包

    1. 最小依赖,去除冗余
    2. 打包规则配置
    3. AB文件最后检查冗余 参考1 参考2
  • AB包更新下载
    1. 多线程断点续传
  • AB包加载
    1. 同步、异步 引用计数
    2. 动态清理

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…)
  • 背景音(长)
  • 特殊播放(短)
  • 声音的类型设置
  • 声音播放的缓存使用

核心战斗


编辑器扩展

大多数为非编程人员提供便利操作

参考1

参考2


场景管理

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)大概分为以下几个步骤:

  1. 从 SVN 拉取工程代码(source),策划配置文件(config),构建工具脚本(tools)以及打包脚本(deploy);
  2. 执行脚本把策划配置文件(xlsx)转成代码可读的 Lua 文件;
  3. 执行脚本调用 Unity 生成 AssetsBundle,以及后续资源相关处理;
  4. 执行脚本调用 Unity 生成 Xcode 工程;
  5. 执行脚本调用 Fastlane 进行 Xcode 工程的编译以及打包;
  6. 执行脚本把生成的 ipa 以及 manifest 上传到版本发布服务器。

项目优化

  • CPU方向

    一、DC (DrawCalls) CPU调用底层图形接口

    1. Draw Call Batching 批处理,物体合并一个描绘来渲染

    ​ (1)Static Batching

    ​ (2)Dynamic Batching

    1. 纹理打包成图集,减少材质使用

    2. 尽量少的使用反光、阴影之类的效果,导致物体多次渲染

    二、物理组件 (Physics)

    1. 合适的Fixed Timestep

    2. 尽量不适用网格碰撞器

      性能优化角度,物理组件能少用则少用,不是不用

    三、GC(Garbage Collect)

    1. 频繁GC会加重CPU的负担,GC是Mono运行时的机制,非Unity3D的引擎机制,GC针对Mono对象,管理Mono的托管堆

    2. GC不是来处理引擎的assets(纹理、音效)的内存释放的,Unity引擎也有自己的内存堆,不是和Mono一起使用所谓的托管堆

    3. 引用类型分配到托管堆(类的实例,字符串,数组),int,float,struct值类型是分配到堆栈上而不是堆上,类实例,字符串,数组 关注对象

    4. GC的触发时机

      (1)堆内存不足自动调用

      (2)编程人员手动调用

    四、代码质量 代码检测 C#端 (PVSStudio),Lua端(?)C#和Lua 内存泄漏问题

  • GPU方向

  • 内存方向


线上日志查询(错误,崩溃 。。。)

  • Bugly
  • 日志发送到服务器
  • 自身日志系统的彩蛋查看
  • Unity日志函数LogReceived+LogReceivedTread?