电子说
Unity优化是一个很大的概念,我们优化时需要注意三个方面:CPU优化,GPU优化,内存优化。
CPU方面的优化:
(1) 减少DrawCall.
(2) 物理组件(Physics)。
(3) 减少GC(垃圾回收)次数。
(4) 脚本的代码质量。
一、对DrawCall的优化
1、什么是DrawCall ?
答:Draw Call就是CPU调用图形编程接口,比如DirectX或OpenGL,来命令GPU进行渲染的操作。
2、 如何减少DrawCall ?
答: 思路就是每个物体尽量减少渲染次数,多个物体最好一起渲染。所以有三个方案:
(1)使用批处理,Unity在运行时将物体合并一次渲染。这里分为动态批处理和静态批处理。
(2)通过把文理打包成图集尽量减少材质的使用。
(3)尽量减少反光,阴影之类的效果,因为那会使物体多次渲染。
静态批处理就是将没有生命的不同物体设置为Static。
动态批处理是引擎自动进行的,例如动态实例化Prefab(预制体)如果动态物体共享相同的材质,引擎会自动批处理。动态批处理有很大限制,网格物体顶点数不能超过900。
二、对物理组件的优化
1、设置一个合适的FixedTimestep。
2、尽量不要使用网格碰撞器,占用CPU计算。
三、处理GC的优化
虽然GC是用来处理内存的,但是的确会增加对CPU的开销,因此对于GC的优化目标就是尽量减少GC的触发。
GC是何时触发的?
1、堆的内存不足时,自动调用GC。
2、编程人员手动调用GC。
GC的优化说白了就是代码的优化,主要注意一下5点:
(1)字符串连接的处理。。
(2)尽量不要使用foreach,减少迭代器产生。
(3)不要直接访问gameObject的tag属性。换成“if(obj.CompareTag(”Player“))”
(4)使用对象池,以实现空间的重复利用。
(5)不要使用LinQ。
四、对代码质量的优化
(1)Transfrom组件获取一次就保留引用,而不是每次都获取。
(2)不用频繁的GetComponent
(3)使用内建数组,如Vector3.zero而不是new Vector(0,0,0)。
(4)对方法的参数优化,善于使用ref关键字。
GPU方面的优化:
GPU瓶颈:
(1)填充率,可以简单理解为图形处理单元每秒渲染的像素数量
(2)像素的复杂度,比如动态阴影、光照、复杂的shader等
(3)几何体的复杂度(顶点数量)
(4)GPU的显存带宽
影响GPU性能的无非就两大方面,一方面顶点数量过多,像素计算过于复杂;另一方面就是GPU的显存带宽。
优化方法:
① 减少顶点数量,简化计算复杂度。
② 压缩图片,以适应显存带宽。
一、减少顶点数量,简化计算复杂度
(1)保持材质的数目尽可能少,更容易批处理。
(2)使用纹理图集,代替小贴图。
(3)如果使用了纹理图集和共享材质,使用Renderer.sharedMaterial来代替Renderer.material。
(4)使用光照贴图(lightmap)而非实时灯光。
(5)使用LOD(多层次细节),好处就是那些离得远看不清的细节可以忽略。
(6)遮挡剔除
(7)使用mobile版的shader,因为简单。
二、压缩图片,减小显存带宽压力
(1)OpenGL ES2.0使用ETC1格式压缩等,在打包设置里有。
(2)使用MipMap,小图集
内存方面的优化:
(1)Unity3D的内部内存
(2)Mono的托管内存
(3)若干自己引入或第三方DLL所需的内存(非重点)
全部0条评论
快来发表一下你的评论吧 !