接上篇:
4、Enum:枚举当Key使用或枚举转换为String,都会有GC
5、闭包:函数和与其相关的引用环境组合成的实体。闭包IL代码会出个新类,频繁调用一个函数时,尽量不用。
6、其他
1>update中没必要每帧的。
2>不要常使用find,在start中缓存。
3>使用内建数值,比如Vector3.zero而不是new Vector3(0, 0, 0);
4>主线程同步加载资源会瞬卡,异步加载;
5>逻辑裁剪;
6>对象回收复用,对象池;
7>LOD:根据不同目标平台制订资源规则:主角用高,其他玩家中低;特效自动处理成H,M,L三版本;
8>meshcollider换为boxcollider
.......
(上面会持续更新一些优化中的细节)
优化流程: 测量---分析---优化---验收
优化工具:Unity Profiler, Adreno Profiler,WeTest,UWA
性能指标:
瞬卡与平局帧数(fps)
渲染批次数(drawcall)
内存使用量(memory)
崩溃率(crash)
包体大小(install file size)
内存优化:
1>UI图集最大1024*1024,尽量提高图集利用率;
GPU优化:(优化Shader,减少OverDraw)
1>Fog { Mode Off } 关闭雾效;
2>fragment剔除Alpha为0的像素,减少OverDraw;
3>Lod
CPU优化:(GC)
1>DrawCall,合批:
同一界面的UI资源放在一个图集中,方便合批;重复利用的公用的放在common;
相邻节点尽量使用同一图集的图片;
线框模式下,Rectransform重叠会增加DC;
Canvas.SendWillRenderCanvases():UI被Enable、顶点色变化、Text 组件的文本变化等时所产生的调用,CPU 飙高大部分情况下主要是因为UnityEngine.UI.Graphic.UpdateGeometry()重新生成了所有的顶点数据;
UGUI动态合批:Canvas合并UI元素的网格,并且生成发送给Unity渲染管线的命令。减少一些频繁变动的UI 元素
的Canvas 下的顶点数量;打开界面时看不见的prefab尽量拆分,动态加载;切换active也会带来消耗;Layout也有消耗;Raycast Target 默认不勾选;
静态批次只需要在Inspector勾选static选项即可,场景中的多个物件如果是不动的(包括位置、缩放、旋转等),并且共享同一材质那么可以选择采用静态批次。
2>GC前面的1,2,3,4,5,6讲了很多。
(持续更新)