Unity 性能优化方案

来源:CSDN 浏览量:121 发布时间:2018-12-28 11:09:35

** 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.减少,水面折射效果,或者雾效果。

编程过程中难免会出现差错,欢迎大牛批评指正。本人专注图形图像开发,欢迎大家共同交流与学习。

--------------------- 


原文:https://blog.csdn.net/weixin_43967425/article/details/84928476