1 资源方面
1.1 动态物体
控制面片数量(300-2000)
控制Skinned Mesh Render为1个
控制材质数量为1-3个
控制骨骼数量<30根
1.2 静态物体
控制网格顶点数<500个
在属性面板中将其标为static(Unity 会用Static Batching对静态物体进行优化)
Animation组件如果不需要尽量去除
1.3 自带地形
控制地形分辨率(地形高度图尺寸)<257
地形中混合纹理数目尽量不超过4个
1.4 美术资源
纹理贴图尽量采取压缩格式
纹理尺寸够用就行,尽量小于1024
建议使用MipMap 提高渲染效率
2 引擎方面
控制Important灯光个数,1/0;光源设置:Pixel Light Count为1-2个
设置合理的剪切平面,可根据不同场景进行修改
粒子特效:
屏幕上的粒子总数建议小于200个
每个粒子发射器所发射的粒子总数建议不超过50个
粒子的Size值尽量小
对于非常小的粒子,在其粒子纹理中可以去除Alpha通道
物理引擎:
碰撞体尽可能使用Sphere和Box,避免使用Mesh
渲染优化:
尽可能避免使用Alpha Test和Alpha Blend
可能的话,使用Alpha Blend替代Alpha Test
DrawCall Batching
Unity在渲染时,可以将一些物体合并,从而使用一个DrawCall来渲染他们。
理论上讲,Unity Batching的物体越多,渲染性能越好。
Static Batching
针对静态物体进行Batching
Dynamic Batching
对于相同材质的动态物体,Unity会自动对其进行Batching,缩放物体无法与非缩放物体进行Batch
纹理合并
Texture Patching
遮挡剔除
Occlusion Culling
3 代码方面
对于有些函数可以每隔几帧执行一次
如在Update函数中:
if(Time.frameCount%6==0)
<span style="white-space:pre"> </span>DoSomething();
通过使用InvokeRepeating函数实现定时重复调用
如启动0.5秒后每隔1秒执行一次
InvokeRepeating("DoSomething", 0.5f, 1.0f);
尽量少使用临时变量,特别是在Updata等实时调用的函数中。
定时进行垃圾回收
如在Update函数中:
if(Time.frameCount%50==0)
{
System.GC.Collection();
}
优化数学运算
少用float,而用int
用乘法代替除法