1.为什么需要进行优化

优化一为什么需要做优化,当你的App对性能的要求越低,那么他覆盖的用户将会更多,直接影响到你的成本和用户群体

优化的核心是解决用户体验问题

内存值 Android PSS内存峰值 1400M PSS 常规内存 <700m

 

2.优化三方向

1. CPU 2.GPU-渲染优化 3.内存优化

CPU 和 渲染优化,解决的是用户玩游戏的直观感受,譬如卡帧,反应慢

1).CPU优化

当同一时刻,大量的计算或者耗时操作堆积的时候,会造成界面卡死,当前其实是一个CPU性能过剩的时代,常规操作,无需考虑太多的性能问题,当从感官上明显觉得某一块,实在太慢,这个时候我们才会去针对性优化

设计层--引擎模块性能开销

渲染模块、动画模块、物理模块、UI模块、粒子系统、加载模块和GC调用

不要堆叠耗时的操作在同一帧,设计内容的时候,留好优化的空间,不要写死任何可能会影响性能的东西

  1.频繁的文件写入

  2.通信中的消息解析

  3.实例化prefab对象

  4.资源加载与释放

逻辑层--自身代码性能开销

当许多耗时的操作堆叠,最为常见的就是loading条了,他是当我们无法避免的需要把时间花费到别的东西上的时候,用表现来解决用户的体验问题

  1.资源依赖个数[AssetBundle依赖个数]当我们拖动任何资源到prefab中的时候,Unity都会记录下该资源的索引,所以当我们加载一个预制体的时候,他所依赖的资源,我们都要添加上,才能正确的显示出来,所以从一开始,我们就要控制prefab对资源的依赖,一个prefab的资源依赖应当是有限的,他所拥有的节点和依赖的资源,应当都尽可能的小

  2.预置体的节点个数[prefab中的节点数量]当节点个数增多,实例化的时间会明显增加,实例化过程是一个同步过程,他如果出现耗时操作,将会卡断我们主线程,直到完成实例化,所以当一个界面下有好几个子界面的时候,我们应当通过先显示主界面,在需要的时候再实例化其他界面,这样就不会给玩家打开一个界面极其久的感觉【这块以后在活动将会较为明显】

  3.循环遍历,譬如在table中查找某个内容,查找到了,就应当break掉,而不需要进行剩下的循环

  4.常规耗时操作 子节点遍历查找,当频繁的需要某个组件或者节点的时候,我们应当在lua中用变量保存起来,下次直接使用即可,不要每次使用的时候临时去查找 【空间换时间】

  5.控制Update中的操作,当能够用秒检测能够完成的 就不要用帧检测

  6.观察者模式是一个非常优秀的模式(g_event),但同时也是一个容易出现性能瓶颈的模式,且优化难度较大,当大量的监听中都做了一些耗时操作的时候,会出现界面卡死,所以当在监听较多的时候,不要出现复杂的计算

  7.算法优化

2).GPU

DC 汇总峰值 <400,单个特效出现的时候,允许短时间超越

  1.常规DC UI 100以内

  2.场景 150以内

设计层

核心-控制所有相机视野内的材质球的个数,顶点的个数

  1.控制场景中的模型的多少

  2.控制ui上的显示元素的多少

  3.场景中的静物合批(Unity自带)

  4.界面上使用图集减少渲染压力

  5.合理的使用特效

逻辑层

  1.当不需要看到的节点,可以做手动剔除,关闭渲染,UI全屏界面的时候,关闭场景显示,场景表现较多的而无法继续优化的时候,关闭部分UI界面,降低光晕效果,降低品质等等

  2.Sahder的性能消耗把控

  3.注意纹理交错的时候,会打断图集纹理的合批,当界面ui元素较多的时候,需要从这方面去入手减少DC

3).内存优化

1.资源内存占用 2.引擎模块自身内存占用 3.托管堆内存占用

纹理格式:

  1.色阶问题-尽量减少纹理的色差范围,使其尽可能使用硬件支持的压缩格式进行存储

  2.ETC1-不支持透明通道 解决办法:将透明贴图尽可能分拆成两张,即一张RGB24位纹理记录原始纹理的颜色部分和一张Alpha8纹理记录原始纹理的透明通道部分。然后,将这两张贴图分别转化为ETC1格式的纹理,并通过特定的Shader来进行渲染,从而来达到支持透明贴图的效果。该种方法不仅可以极大程度上逼近RGBA透明贴图的渲染效果,同时还可以降低纹理的内存占用,是我们非常推荐的使用方式。

纹理尺寸:尽量降低纹理尺寸

较为合理的内存分配

  假设总体内存设定为150MB --------- 纹理资源:50MB 网格资源:20MB 动画片段:15MB 音频片段:15MB Mono堆内存:40MB 其他:10MB

内存泄漏