部分优化总结

想到了会再补充

运行效率

通用优化

  1. 部分很复杂的逻辑,较通用的是,使用并行化处理,开多线程
  2. 也可以通过分帧处理,一段处理,分开到多帧里处理
  3. 算法或结构的改进
  4. 对一些常用的计算改成查表方法,例如一些开根及三角函数,按一定的区间拆成表格

脚本优化

  1. 脚本往更快的语言搬相同的逻辑

一般语言速度对比 C++ > C# > lua > python

  1. 脚本减少对低层接口的调用,或脚本一次性收集后,再统一调用。
    • 低层接口一般是为了调用一些与引擎相关的功能,引擎一般是使用更快的语言编写,故脚本与引擎语言存在box与unbox流程,即两种语言间的数据处理
    • 频繁的数据交互,会放大这个数据处理效能问题
  2. 脚本语言,一般有垃圾回收机制,尽量避免在游玩中GC,及对象的递归引用问题
    • GC其调用过程耗时较大
    • 为避免GC,尽可能在关键游玩点申请足够的数据缓冲,避免内存发生变化
    • 递归引用的GC,会引发更大的耗时,可以使用“弱引用”的机制解决
    • GC的时机尽可能放在用户不能操作时

分析卡顿的方法

  1. 基于帧的分析:计算每一帧运行时间,分析使用这个时间的原因
    • 运行一段时间
    • 一般会设置时间使用上限,只截取超出限的帧信息
    • 帧中会生成调用栈与各调用的时间
  2. 基于调用分析:计算函数的总调用时间,分析使用函数占用时间比
    • 运行一段时间
    • 会列出函数的平均时间

内存

内存优化

  1. 使用二进制保存
    • 项目开发,有时为了方便修改,数据常用脚本,或字符串保存
    • U3D很多资源会用字符串保存,除了减少精度的做法,更好的方法是转二进制
  2. 使用字符串缓冲,减少字符串拼接,避免内存碎片变大

以往经验,U3D加载资源时,会产生大量的资源路径拼接,导致托管内存激增,碎片变多

  1. 资源加载后,资源文件应该释放,资源实体引用尽可能复用

在U3D中资源为AssetBundle,由于AssetBundle的内存区块的管理机制,会导致很少资源也会产生很大的内存占用

内存分析

  1. 一般内存占用分析,可以对同一过程多次运行,观察内存的增长情况

对于复杂的过程,可能会内部产生很多全局变量,一般多次执行后,这些变量就不会增长了

  1. 分析脚本的内存泄漏,一般可以通过工具分析,了解一些主要类型的数据增长情况,并通过引用路径分析误被引用的地方
  2. 对于C++编译语言,VS也有提供内存的分析工具,可以通过多次运行了解具体增长点
  3. 当然我们也可以故意重载内存分配函数,标记每一次内存分配与释放情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值