想到了会再补充
运行效率
通用优化
- 部分很复杂的逻辑,较通用的是,使用并行化处理,开多线程
- 也可以通过分帧处理,一段处理,分开到多帧里处理
- 算法或结构的改进
- 对一些常用的计算改成查表方法,例如一些开根及三角函数,按一定的区间拆成表格
脚本优化
- 脚本往更快的语言搬相同的逻辑
一般语言速度对比 C++ > C# > lua > python
- 脚本减少对低层接口的调用,或脚本一次性收集后,再统一调用。
- 低层接口一般是为了调用一些与引擎相关的功能,引擎一般是使用更快的语言编写,故脚本与引擎语言存在box与unbox流程,即两种语言间的数据处理
- 频繁的数据交互,会放大这个数据处理效能问题
- 脚本语言,一般有垃圾回收机制,尽量避免在游玩中GC,及对象的递归引用问题
- GC其调用过程耗时较大
- 为避免GC,尽可能在关键游玩点申请足够的数据缓冲,避免内存发生变化
- 递归引用的GC,会引发更大的耗时,可以使用“弱引用”的机制解决
- GC的时机尽可能放在用户不能操作时
分析卡顿的方法
- 基于帧的分析:计算每一帧运行时间,分析使用这个时间的原因
- 运行一段时间
- 一般会设置时间使用上限,只截取超出限的帧信息
- 帧中会生成调用栈与各调用的时间
- 基于调用分析:计算函数的总调用时间,分析使用函数占用时间比
- 运行一段时间
- 会列出函数的平均时间
内存
内存优化
- 使用二进制保存
- 项目开发,有时为了方便修改,数据常用脚本,或字符串保存
- U3D很多资源会用字符串保存,除了减少精度的做法,更好的方法是转二进制
- 使用字符串缓冲,减少字符串拼接,避免内存碎片变大
以往经验,U3D加载资源时,会产生大量的资源路径拼接,导致托管内存激增,碎片变多
- 资源加载后,资源文件应该释放,资源实体引用尽可能复用
在U3D中资源为AssetBundle,由于AssetBundle的内存区块的管理机制,会导致很少资源也会产生很大的内存占用
内存分析
- 一般内存占用分析,可以对同一过程多次运行,观察内存的增长情况
对于复杂的过程,可能会内部产生很多全局变量,一般多次执行后,这些变量就不会增长了
- 分析脚本的内存泄漏,一般可以通过工具分析,了解一些主要类型的数据增长情况,并通过引用路径分析误被引用的地方
- 对于C++编译语言,VS也有提供内存的分析工具,可以通过多次运行了解具体增长点
- 当然我们也可以故意重载内存分配函数,标记每一次内存分配与释放情况