Unity 性能优化方案

** c# 语言层面的优化**
1:主要思想是减少存的动态分配和释放,以及内存泄露,减少垃圾回收。
(1)字符串的处理 使用stringbuild 类代替string 进行多个字符串的拼接。
(2)String.format();
以上的方法都是性能比较优化的方法
避免使用“+”“aaa”+“bbb”这种方式 原因是“+”对字符串进行拼接,会导致临时
堆string 对象发生频繁的堆对象的分配和释放。
2:尽可能使用for循环代替foreach
数组 泛型list<> 一律使用for ,字典使用foreach
原因: 每次foreach产生一个临时的迭代器对象,迭代器会额外的分配内存
3:频繁调用的函数中,如果有临时变量是引用类型,要将其改为成员变量。避免频繁的堆对象的创建和释放。
4:如果函数运行需要一个List 需要设置List为成员变量 独立与函数的运行,可以
通过clear()函数清空,重复使用全局成员集合,清空函数不会删除内存空间,大大的减轻性能的负担。
5:避免使用Lambda表达式,存在内存泄露的内存隐患。
6:尽量使用对象池 避免对象的频繁创建和释放,导致大量无效内存的积累,引发GC(垃圾回收)操作,造成性能的降低
7:避免装箱和拆箱的操作,会导致堆内存的分配。
8:避免使用AraayList会把所有插入的数据当作object类处理,存在一个装箱的过程
尽量使用泛型List<>;
9:避免使用反射机制,运行时获取类型信息,性能低下。
10:即时的将对象设置为null 委托事件即时注销。
Unity脚本开发方面
基本思想减少动态内存分配和释放,减少耗时函数的调用,尽可能的使用缓存。
1:控制Startcorountien 的使用次数,避免频繁的开启协程,开启一个协程至少分配37B的内存空间(corountien类的实例 分配21B Enumerator 分配16B)
如果仅仅是延迟运行,定时运行函数,可以使用invoke invokerepeating 代替
2:对象查找 gameobject.find(); 全局的查找方式,无法查找隐藏的对象,效率低下
Transform.find 从自身位置查找,性能较优的推荐方法
Gameobject.findobjectswithTag 通过标签查找,效率较高,但是需要设置标签稍显麻烦。
建议在Awake 或者Start 函数中查找对象并保存引用,切忌在Update中动态的查找
3:缓存组件
注意获取组件的方法GetCompent 方法大约会分配39B的堆内存,并且GetCompent是去访问unity原生代码效率很低,使用缓存访问,性能相差几十倍。缓存访问性能要高得多。
(a)尽量避免在Update函数中做计算,可以使用InvokeRepeating,间隔一段计算一次。
(b)避免使用SendMessage 性能底下,使用了反射机制,要使用委托 delegate的事件模拟消息机制。
(c)删除无用的预制体上的组件,删除类中无用的函数。
(d)脚本的禁用,脚本使用的时候开启,不用的时候关闭,需要专门写一套管理机制。
图形方面
1.不要使用实时阴影,使用阴影纹理或者简单的图片模拟阴影。
2.减少顶点,减少三角面数,峰值小于10w面/每帧,使用LOD进行多层次模型设置,进行遮挡。
3.减少Drawcall 峰值<200 对场景物件 比如说:石头,树木等使用相同材质相同贴图的物体进行批处理,降低DC。人物模型(人物模型一般都是带骨骼的)SkinMesh。即便使用相同的材质贴图,DC也不能进行批处理。使用Lightmap技术降低DC。 UI图素进行合并(打包图集)降低DC。
4.尽量使用简单材质,适合移动平台(手机)Mobile这种Shader或者使用自定义一些优化过的Shader,高级Shader严重降低帧率,加大能耗,或者不可用。
5.在纹理和质量之间做平衡,在保证质量不受太大影响的情况下,尽量使用小尺寸的纹理,提升效率。减少安装包的大小,九宫格等
6.减少骨骼数量的使用15个上下左右,减少粒子系统,粒子的数量。尽量减少粒子数量。
7.共享材质 多一个材质DC就会上升 使用共享材质 将多张贴图画在一张较大的贴图上面,达到共享材质的作用。
8.减少,水面折射效果,或者雾效果。
编程过程中难免会出现差错,欢迎大牛批评指正。本人专注图形图像开发,欢迎大家共同交流与学习。

猜你喜欢

转载自blog.csdn.net/weixin_43967425/article/details/84928476