Unity 3D优化,游戏开发的优化问题

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所需的内存(非重点)

版权声明:本文为CSDN博主「Duke教授」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013509878/article/details/81407724

推荐阅读