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
层。