Unity3D性能优化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D性能优化相关的知识,希望对你有一定的参考价值。
一、美术资源优化
1.动态物体,角色、怪物、NPC
(1)控制面的数量,300-2000个
(2)控制Skinner Mesh Renderer的数量,1个
(3)控制材质数量,1-3个
(4)控制骨骼的数量,小于30个
2.静态物体
(1)控制网格顶点数,少于500个
(2)标记为static,静态批处理
(3)移除不需要的组件
3.自带地形
(1)控制地形的分辨率,高度图尺寸小于257
(2)地形纹理中尽量使用少的混合纹理数,不要超过4个
4.纹理
(1)格式,采用压缩格式
(2)尺寸,长宽小于1024
(3)建议使用MipMap,有可能增加程序大小,但会提高渲染效率
5.音频
(1)长音乐(背景音乐),使用ogg或mp3格式
(2)短音乐,使用wav或aif格式的未压缩格式
二、引擎优化(设置)
1.光源
(1)控制光源的数量,数量越多,drawcall越多
(2)控制Important光源的数量(实时作用于动态物体),1个或0个
(3)Pixel Light Couht(动态物体上作用的光源数量,不包含mportant光源),1-2个
2.相机
裁剪平面,根据不同场景进行不同的修改
3.粒子
(1)屏幕上的粒子总数,建议小于200个
(2)每个粒子发射器发射的粒子总数,建议小于50个
(3)粒子的大小,粒子的size应尽可能的小
(4)对于非常小的粒子,在粒子的纹理中可以去除Alpha通道
4.物理引擎
(1)尽量使用Sphere Collider/Box Collider,避免使用Mesh Collider
5.渲染
(1)避免使用Alpha Test和Alpha Blend,Alpha Test的性价比较低,可能的话使用Alpha Blend代替Alpha Test
(2)将使用的Alpha Test和Alpha Blend的像素数降至最低,尽量不要超过两个两个屏幕的像素数
三、DrawCall
1.Static Batching
原理:<1>静态VertexBuffer + 动态IndexBuffer
<2>将同种材质的物体合并在一个大的VertexBuffer中
<3>在运行时,通过视锥裁剪来动态的改变IndexBuffer
注意:使用static batching后会额外增加内存开销来存储Batch后的数据
2.Dynamic Batching,对于相同材质的动态物体,Unity会自动对其进行batching
原理:<1>动态VertexBuffer + 动态IndexBuffer
注意:<1>目前之支持小于900顶点的网格物体
<2>如果shader中使用了Position/Normal/UV三种属性,只能Batching 300顶点以下数的物体;如果使用Position/Normal/UV/UV1/Tangent等属性,则只能Batching 180顶点以下的物体
<3>缩放物体无法与非缩放物体进行Batching
四、纹理合并
五、遮挡剔除,Occlusion Culling
六、代码.
if(Time.frameCount % 6 == 0){ }
(2)减少使用临时变量,尤其是在Update方法中
(3)定期垃圾回收
(3)优化数学运算:<1>减少使用float,使用int
<2>减少使用复杂的数学函数,比如sin/cos等函数
<3>改除法为乘法
以上是关于Unity3D性能优化的主要内容,如果未能解决你的问题,请参考以下文章