-  DrawCall:CPU向GPU发送渲染命令的过程。
-  批次:批次是指在一次渲染帧中提交的 DrawCall数量。
-  合批:即批量渲染,合批是一种优化技术,通过将多个需要渲染的物体合并为一个或少数几个 DrawCall。
-  静态合批:对于始终不动的物体使用合并批次处理。 
通过编辑器静态合批:
- 勾选
Edit->Project Settings->Player->Other Settings->Static Batching,打开静态合批功能;- 在游戏对象的属性检查器中勾选
Static的Batching Static选项,参与合批;通过代码静态合批:
//obj:GameObject对象 StaticBatchingUtility.Combine(obj);静态合批的注意事项:
- 游戏对象处于激活状态;
- 游戏对象拥有一个启用状态的网格过滤器组件;
- 网格过滤器组件具有对网格的引用;
- 网格已启用
Read/Write功能;- 网格顶点数大于
0;- 该网格未与另外的网格组合;
- 游戏对象拥有一个启用状态的网格渲染器组件;
- 网格渲染器组件不使用带有
DisableBatching标签设置为true的着色器的任何材质;- 批处理的网格使用相同的顶点属性。例如,
Unity可以批处理使用顶点位置、顶点法线和一个UV的网格,但不能批处理使用顶点位置、顶点法线、UV0、UV1和顶点切线的网格;- 合批出来的每个批次最大存在
64000个顶点,如果超过会创建一个新的批次;
- 动态合批:在每一帧对移动的游戏对象进行批处理以减少绘制调用。
开启动态合批:
- 勾选
Edit->Project Settings->Player->Other Settings->Dynamic Batching选项后,Unity自动在每一帧进行合批;动态合批的注意事项:
Unity不能对包含超过900个顶点属性和225个顶点的网格应用动态批处理;- 动态合批不能作用于不同的材质实例;
- 带有光贴图的游戏对象有额外的渲染参数,处理光照贴图的游戏对象必须指向相同的光照贴图位置;
Unity不能完全将动态批处理应用于使用多通道着色器的游戏对象;
- GPU Instancing:是一种- Draw call的优化方案,使用一个- Draw call就能渲染具有多个相同材质的网格对象,可以通过添加变量来减少重复的外观,每个实例可以具有不同的属性,例如颜色或缩放。
开启
GPU Instancing:
- 选中一个材质,在属性检查器窗口勾选
Enable GPU Instaning;
GPU Instancing的注意事项:
- 使用相同的材质和网格;
- 材质的着色器必须支持GPU实例化;
- 网格的顶点布局和着色器必须相同;
- 每个实例拥有不同的变换信息;
- 遮挡剔除:不渲染被遮挡的物体;
开启遮挡剔除:
- 在游戏对象的属性检查器中勾选
Static的Occluder Static选项,表示遮挡物;- 在游戏对象的属性检查器中勾选
Static的Occludee Static选项,表示被遮挡物;- 打开
Window->Rendering->Occlusion Culling窗口选择Object->Occlusion Areas创建一个遮挡区域调整好范围后点击Bake烘焙;
- Occlusion Portal组件:控制是否开启遮挡剔除;
属性:
Edit Bounds:遮挡物区域;
Open:是否关闭遮挡;
Center:遮挡中心点;
Size:遮挡大小缩放
- 光照优化:
- 关闭远离相机的光照;
- 使用烘焙光照减少实时计算光照;
- 图片优化:
- 图片应用在移动端时,在导入
Unity前,可以将图片的每条边进行调整,确保每条边的长度都是2的正整数次方个像素;- 选择合适的图片压缩级别、过滤模式、图片格式;
- 对不需要代码读写的图片取消
Read/Write勾选;- 对非高需求的图片
Aniso Level值设置为1;- 勾选
Generate Mip Maps可以将离相机远的图片模糊处理,这种方式提高了性能但是也会增加内存消耗,2D游戏建议取消勾选;
- Sprite Atlas精灵图集:
使用
Sprite Atlas前需要先安装2D Sprite插件。优点:
- 减小资源文件所占的大小;
- 打包到图集中的图片会共享纹理数据,减少了重复的存储;
- 打包到图集中的图片会在一次
Draw Call中处理,提高了渲染性能;缺点:
- 如果图集中有一些图片未被使用也会被加载,可能会反向优化浪费内存;
- UI优化:
- 对于不需要与鼠标交互的
UI,应该取消Raycast Target射线检测控件;- 对于不需要的
UI应该移除,将透明度设置为0还是会参与渲染;- 尽量避免
UI的重叠;- 对于面板类
UI可以使用更小的图片,使用九宫格模式进行拉伸;
- 模型优化
Model信息栏:
- 通过修改
Mesh Compression选项进行网格压缩;- 对不需要使用代码修改的
Model应该取消Read/Write选项的勾选;- 通过
Optimize Mesh选项优化网格的顶点顺序;- 如果模型未使用法线、切线、光照
UV等,可以设置为None或取消勾选;- 勾选
Rig中的Optimize Game Objects可以优化模型;- 没有动画的模型取消勾选
Animation中的Import Animation;- 通过
Anim.Compression选择合适的动画压缩策略;- 勾选
Edit->Project Settings->Player->Other Settings->Optimize Mesh Data,Unity会在构建的时候中对网格数据进行优化处理,但是可能会导致模型的动画不正确;合并网格:
- 对于材质相同的模型可以合并网格;
- LOD Group组件:
优化原理:为一个游戏对象设定多个模型,这些模型消耗的游戏性能由高到低排列,根据摄像机距离模型的远近自动显示对应的模型。
使用步骤:
- 添加
LOD Group组件;- 将不同距离显示的模型添加为子元素;
- 在不同的
LOD通道添加指定的模型;
- 动画优化:
- 修改剔除模式,根据实际情况调整
Animator中的Culling Mode选择;- 优化蒙皮网格渲染,取消
Skinned Mesh Renderer中的Update When Offscreen,避免在屏幕外进行渲染;- 简单动画使用缓动动画插件(例如:
DoTween)实现,减少动画组件;
- 音频优化:
- 在没有强需求使用立体声时,可以勾选音频文件的
Force To Mono,将音频转换成单声道;- 根据不同的平台对
Load Type、Compression Format、品质、Sample Rate Setting等进行修改;
- 物理优化:
- 减少网格碰撞器的使用;
- 对于既可以使用碰撞器也可以使用触发器的功能,使用触发器不需要额外的物理计算,相对性能更好;
- 尽量减少刚体组件,因为刚体组件的物理计算较多;
- 添加刚体组件的模型,如果没有受力行为,应该取消
Is Kinematic的勾选;- 勾选
Edit->Project Settings->Player->Other Settings->Optimization->Prebake Collision Meshes,可以提高碰撞的效率,但是构建游戏的时间会增长。- 在
Edit->Project Settings->Physics/Physics 2D->Layer Collision Matrix设置Layer层之间的碰撞矩阵,剔除不参与碰撞的Layer层。