Unity常用性能优化

  1. DrawCallCPUGPU发送渲染命令的过程。

  2. 批次:批次是指在一次渲染帧中提交的DrawCall数量。

  3. 合批:即批量渲染,合批是一种优化技术,通过将多个需要渲染的物体合并为一个或少数几个DrawCall

  4. 静态合批:对于始终不动的物体使用合并批次处理。

通过编辑器静态合批:

  1. 勾选Edit->Project Settings->Player->Other Settings->Static Batching,打开静态合批功能;
  2. 在游戏对象的属性检查器中勾选StaticBatching Static选项,参与合批;

通过代码静态合批:

//obj:GameObject对象
StaticBatchingUtility.Combine(obj);

静态合批的注意事项:

  • 游戏对象处于激活状态;
  • 游戏对象拥有一个启用状态的网格过滤器组件;
  • 网格过滤器组件具有对网格的引用;
  • 网格已启用Read/Write功能;
  • 网格顶点数大于0
  • 该网格未与另外的网格组合;
  • 游戏对象拥有一个启用状态的网格渲染器组件;
  • 网格渲染器组件不使用带有DisableBatching标签设置为true的着色器的任何材质;
  • 批处理的网格使用相同的顶点属性。例如,Unity可以批处理使用顶点位置、顶点法线和一个UV的网格,但不能批处理使用顶点位置、顶点法线、UV0UV1和顶点切线的网格;
  • 合批出来的每个批次最大存在64000个顶点,如果超过会创建一个新的批次;
  1. 动态合批:在每一帧对移动的游戏对象进行批处理以减少绘制调用。

开启动态合批:

  • 勾选Edit->Project Settings->Player->Other Settings->Dynamic Batching选项后,Unity自动在每一帧进行合批;

动态合批的注意事项:

  • Unity不能对包含超过900个顶点属性和225个顶点的网格应用动态批处理;
  • 动态合批不能作用于不同的材质实例;
  • 带有光贴图的游戏对象有额外的渲染参数,处理光照贴图的游戏对象必须指向相同的光照贴图位置;
  • Unity不能完全将动态批处理应用于使用多通道着色器的游戏对象;
  1. GPU Instancing:是一种Draw call的优化方案,使用一个Draw call就能渲染具有多个相同材质的网格对象,可以通过添加变量来减少重复的外观,每个实例可以具有不同的属性,例如颜色或缩放。

开启GPU Instancing

  • 选中一个材质,在属性检查器窗口勾选Enable GPU Instaning

GPU Instancing的注意事项:

  • 使用相同的材质和网格;
  • 材质的着色器必须支持GPU实例化;
  • 网格的顶点布局和着色器必须相同;
  • 每个实例拥有不同的变换信息;
  1. 遮挡剔除:不渲染被遮挡的物体;

开启遮挡剔除:

  • 在游戏对象的属性检查器中勾选StaticOccluder Static选项,表示遮挡物;
  • 在游戏对象的属性检查器中勾选StaticOccludee Static选项,表示被遮挡物;
  • 打开Window->Rendering->Occlusion Culling窗口选择Object->Occlusion Areas创建一个遮挡区域调整好范围后点击Bake烘焙;
  1. Occlusion Portal组件:控制是否开启遮挡剔除;

属性:

  • Edit Bounds:遮挡物区域;
  • Open:是否关闭遮挡;
  • Center:遮挡中心点;
  • Size:遮挡大小缩放
  1. 光照优化:
  • 关闭远离相机的光照;
  • 使用烘焙光照减少实时计算光照;
  1. 图片优化:
  • 图片应用在移动端时,在导入Unity前,可以将图片的每条边进行调整,确保每条边的长度都是2的正整数次方个像素;
  • 选择合适的图片压缩级别、过滤模式、图片格式;
  • 对不需要代码读写的图片取消Read/Write勾选;
  • 对非高需求的图片Aniso Level值设置为1
  • 勾选Generate Mip Maps可以将离相机远的图片模糊处理,这种方式提高了性能但是也会增加内存消耗,2D游戏建议取消勾选;
  1. Sprite Atlas精灵图集:

使用Sprite Atlas前需要先安装2D Sprite插件。

优点:

  • 减小资源文件所占的大小;
  • 打包到图集中的图片会共享纹理数据,减少了重复的存储;
  • 打包到图集中的图片会在一次Draw Call中处理,提高了渲染性能;

缺点:

  • 如果图集中有一些图片未被使用也会被加载,可能会反向优化浪费内存;
  1. UI优化:
  • 对于不需要与鼠标交互的UI,应该取消Raycast Target射线检测控件;
  • 对于不需要的UI应该移除,将透明度设置为0还是会参与渲染;
  • 尽量避免UI的重叠;
  • 对于面板类UI可以使用更小的图片,使用九宫格模式进行拉伸;
  1. 模型优化

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会在构建的时候中对网格数据进行优化处理,但是可能会导致模型的动画不正确;

合并网格:

  • 对于材质相同的模型可以合并网格;
  1. LOD Group组件:

优化原理:为一个游戏对象设定多个模型,这些模型消耗的游戏性能由高到低排列,根据摄像机距离模型的远近自动显示对应的模型。

使用步骤:

  • 添加LOD Group组件;
  • 将不同距离显示的模型添加为子元素;
  • 在不同的LOD通道添加指定的模型;
  1. 动画优化:
  • 修改剔除模式,根据实际情况调整Animator中的Culling Mode选择;
  • 优化蒙皮网格渲染,取消Skinned Mesh Renderer中的Update When Offscreen,避免在屏幕外进行渲染;
  • 简单动画使用缓动动画插件(例如:DoTween)实现,减少动画组件;
  1. 音频优化:
  • 在没有强需求使用立体声时,可以勾选音频文件的Force To Mono,将音频转换成单声道;
  • 根据不同的平台对Load TypeCompression Format、品质、Sample Rate Setting等进行修改;
  1. 物理优化:
  • 减少网格碰撞器的使用;
  • 对于既可以使用碰撞器也可以使用触发器的功能,使用触发器不需要额外的物理计算,相对性能更好;
  • 尽量减少刚体组件,因为刚体组件的物理计算较多;
  • 添加刚体组件的模型,如果没有受力行为,应该取消Is Kinematic的勾选;
  • 勾选Edit->Project Settings->Player->Other Settings->Optimization->Prebake Collision Meshes,可以提高碰撞的效率,但是构建游戏的时间会增长。
  • Edit->Project Settings->Physics/Physics 2D->Layer Collision Matrix设置Layer层之间的碰撞矩阵,剔除不参与碰撞的Layer层。
  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jc_caterpillar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值