Unity性能优化

【前言】

这里暂时将性能优化分为程序和渲染两个部分,这里主要说的是程序部分。

如果游戏目标是跑30帧,那么每帧耗时应该是33.3ms;如果目标是跑60帧,那么每帧耗时应该是16.7ms。以60帧为例,我们不可能真的让每帧的耗时都在标准的16.7ms,而是让耗时基本都在16.7ms附近即可。首先观察帧率统计图,看看大部分时间是否能到60帧,不能的话要做整体大的优化。如果能达到再看峰值为什么会出现,尝试优化峰值,让帧率分布尽可能平滑,以减少游戏中大的卡顿。

优化的主要围绕两个问题:一是如何减少当前帧的计算量,简称减量计算;二是如何在减少不了计算量的情况下加速计算,简称加速计算。

【减量计算的策略】

1.分帧

分帧就是将单帧的计算量分摊到多帧完成,从而减少当前帧的耗时峰值, 分帧时每帧处理多少个是需要结合实际的项目情况来确定的,甚至可以统计当前帧的待处理的个数做动态分帧。有如下几种情况:

情况1:对于for循环 ,while循环等,可能在这个循环里要处理的数据很多或者循环次数过多导致整个循环耗时较多,这时可以将计算分摊到多帧,例如原来每个循环有500次处理,分摊到5帧,每帧处理100次。
情况2:当前帧请求加载和实例化的物体可能过多,可以分多帧加载和多帧实例化。
情况3:有个函数内部计算流程很长,涉及到很多不同的部分,看看哪些部分可以拆开,分成几帧完成处理。例如AOI范围内或者视野范围内,新进入的复杂场景建筑或者角色,初始化流程耗时多,可以分到连续几帧内完成。

2.异步

这个不多说,很常见,考虑调用异步接口或者自己实现异步的方法 。需要注意的情况是,有些为了优化需要异步,但不能异步太长时间了,如果在规定时间内还没完成异步,需要有强制同步的方法。

3.延迟

按照正常思考的逻辑,为了处理某些东西,在一帧内可能需要进行重复操作。但我们可以在正常逻辑的基础上做简化,让这些处理在每帧中只做一次,从而省去多次重复操作的计算量,有如下情况:

情况1:有些操作或方法只需要做一次就够了,但在开发过程中会被多个地方调用,这个时候需要重新梳理下逻辑关系,将这些操作延迟到帧尾或下一帧的开头进行调用

情况2:有些操作必须调用好几次,可以将这些操作延迟到一块调用。尤其是对高耗时的接口,对从C#掉C++底层的接口,可以将多次调用尽可能合成一次调用

4.降频

尽管游戏目标是60帧,但有些对象的更新却不必要做到60帧,或者有些的对象某些部分的更新不必要做到60帧,可以降低其更新屏蔽,间隔几帧再更新,有以下情况:

情况1:角色在远处时位置和画面即使更新了,也可能看不出来什么变化,可以根据其和相机的距离做降频,每隔2或者3帧更新一次

情况2:某些UI界面基本很少操作,可以降低到每隔5帧甚至更多来更新一次;

5.缓存

用空间换时间,将某些计算结果或者计算的中间步骤缓存起来,之后直接读取,尤其是运行时需要高频计算的数据,有如下情况:(这种方式会增大内存,要有取舍)

情况1:有些计算比较耗时,但计算结果固定或者只有有限的几种计算结果,可以先离线将结果计算出来,运行时加载到内存里。

情况2:运行时需要动态高频进行计算,在连续几帧内会进行重复计算,可以将这些计算的结果临时缓存下来,以便后续帧里直接读取

6.简化

有些复杂的计算可以用近似的计算结果代替,有些存在多种判断的类(方法)可以拆分成多个不同情况的类(方法),以简化不必要的判断。

7.重构

由于在开发期时间紧张,很多问题没有时间仔细考虑,可以重新梳理下业务逻辑,加深对业务的理解,看看有些地方是不是可以不做,或者换个更好的方式实现,有些数据结构是不是可以优化。

【加速计算的策略】

1.并行化

将计算分摊到多个线程完成,在Unity中就是Job化,可以将一些逻辑Job化,例如射线检查等(在PC上Job是万金油,但在移动端上Job开多了耗电量增加,手机发烫会降频),也可以借助computershader来加速计算

2.面向数据

重新组织数据结构,删除冗余数据,让数据紧密排列,,对CPU缓存更友好,有如下情况:

情况1:用结构体保存对象数据(类可以换成结构体),让这些对象以数组形式在内存里连续分布,通过索引来区分对象。

情况2:如果有很多if,将更常见的可能放在if前面,少见的边界情况放在后面,这就不会走后面的很多逻辑了

情况3:对于需要高频简单读写的纯数据换成Native内存,其读写耗时更少

3.底层优化

优化Dictionary、list等基本操作的耗时,C#的基本实现有优化的空间,尽管这些基本操作的耗时已经非常低了,但是单帧内所有模块的调用次数肯定非常多,加起来的耗时也不少。

4.算法优化

为了实现同样的逻辑,选择速度更快的算法,有如下情况:

情况1:对于调用的基础库的API,寻找功能相同的,性能更好的API

情况2:使用速度更快耗时更少的算法,例如更快的查找和排序算法​

未完待续。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值