1.人物身上少挂载组件,用一个组件触发其他类执行会更好。

比如,创建人物移动的类,这个类不继承mono,然后用一个人物的组件(统管整个人物的组件)的update触发去触发人物移动的类的update。这样人物移动也可以做相应行为。这样可以减少人物挂载的组件。

2.少用projector的方式做投影显示。因为每个projector都会有个相机,这样会产生很多gc。无法合并dc。用面片(quad)然后用rvocontroller可以让他贴在地面上。

unity性能优化之 发热_unity性能优化之 发热

3.getcomponent,GetChild,find等获取性能千万不要在update或循环中做。会产生大量gc。

4.string不能直接用+来拼接,用string.format来实现

5.一些方法要经常获取就应该统一一个地方,一次性获取。减少后面获取的数量

unity性能优化之 发热_unity性能优化之 发热_02

6.字典的key不能用枚举,会有gc

7.当有没用到的widget时就应该要隐藏他,不然uipanel的update会消耗比较高。

8.所有设置能跟随qualitysettings走的话就跟随qualitysettings走,这样可以一并设置显示质量

9.不在主场景就把主场景的摄像机给关了,不在相关的页面则隐藏相关的页面

10.切换界面时并且是全屏界面时,不在当前界面的里面的uirect和camera组件都隐藏,因为可能有特效之类

11.显示不出来的shader中的pass(因为在ui上如果不写深度的话一些pass会在ui后面)就不要渲染,可以关闭该pass减少dc

12.rendertexture能用低质量的就用低质量的,比如用ARGB4444能显示正常的就不用全质量,能降采样的就降采样,因为rt一般比较可能用在摄像机的targetrendertexture里,所以本身的rt越小性能越好。而且如果之渲染纯色的话可以把rt的深度给关了

unity性能优化之 发热_对象池_03

比如我只想碟一个描边过来则可以只显示纯黑色。

13.

unity性能优化之 发热_对象池_04

类似这样的挂载会在人物第一次加载的时候同时去加载特效fx_p_p2_aoyi_bg等。这样会导致loading.readobject的卡顿。

解决办法是改为动态加载特效,并且在bundle上改为每个人物的特效为一个bundle。单独加载,然后在加载完人物的时候隔帧加载特效,减少卡顿。

14.不需要投射阴影或接收阴影的并且场景有关照就要关闭相关设置(因为有些比较偏的物品确实没必要有阴影)

unity性能优化之 发热_unity性能优化之 发热_05

15.把放在片元着色器执行的代码放到定点着色器

unity性能优化之 发热_缓存_06

16.update中的执行逻辑尽量简单,就算有复杂的情况也应该把复杂的情况缓存起来。

获取name会有gc,缓存该缓存的东西,depth一样就不去设置

这样才能0个gc

unity性能优化之 发热_加载_07

17.有一个规范的问题,没用的代码一定要移除,不然会有隐患,比如会产生gc,像下面这段的中间那句话就是没用到的,单产生了gc

unity性能优化之 发热_加载_08

18.ngui的话层级depth如果是同一个图集的话要设置成一样的数值,并且在项目开始时就要规划好哪个图集用在哪些区间。比如LTCombatHud_Atlas是1到50,人物血条是-300到-400,label字体是490到600

19.不是因为动静分离的话,panel尽量只用一个,因为不同的panel同样的图集同样的深度也是会截断的,就会产生截断的多余的dc。

20.开启多线程渲染

21.同样类型的物品如果只是颜色不一样的话就用一个白色贴图然后改颜色就可以了,

unity性能优化之 发热_加载_09

原来是这样的,修改过是

unity性能优化之 发热_unity性能优化之 发热_10

。这样可以合批。

22.System.IO.Path.GetFileNameWithoutExtension会有比较高的消耗,尽量不要用,比如如果要判断可以用IndexOf等尽量代替(当然也许不合理)也可以自己写一个方法代替。

23.尽量用对象池,并且对象池的原则是如果对象池没有则创建一个对象,用完放到对象池并隐藏,需要的时候再拿出来。如果需要使用多个则查看当前的特效是否隐藏,隐藏就拿出来用,如果是显示的则再创建一个,然后放到对象池。然后用lru的方式并控制对象池的上限。

24.shader尽量剔除背面

25.特效总时长要跟真实的特效播放时长一致,不然本来只需要创建一个特效的,因为还在显示则对象池就去创建了多个特效。

unity性能优化之 发热_unity性能优化之 发热_11

26.一些比较常用的特效就不要清除了,缓存起来,比如人物出场的特效,用空间换时间。

27.在一些场景如果前一个场景不能移除则应该要隐藏起来,并且相应的逻辑上的update也要return掉

unity性能优化之 发热_unity性能优化之 发热_12

28.字符串比较不用直接用==,会产生装箱而导致有gc。用compareto或者indexof

29.逻辑判断上,如果已经闯关的而又不需要创建人物的则应该把创建人物那块给退出。

unity性能优化之 发热_加载_13

 

 

 

我的优化方法:

  1. 先在pc上用profile,找耗时的函数,最好找到对象。然后根据执行的代码优化内容。
  2. 特效的优化就是优先加载好再执行,用对象池包装起来。
  3. 尽量再该界面不会有其他界面的内容再执行,比如不会有主场景的内容再执行
  4. 尽量分帧执行或分帧加载内容,均到每帧来做
  5. Ui的dc尽量减少
  6. Mesh能静态的就做静态的
  7. 材质尽量共用,才能合批
  8. 多线程渲染的开关
  9. 。。。

如有更好的方式欢迎留言告知,谢谢!!