Unity性能优化(散记、持续更新)

文章介绍了Unity引擎的性能优化策略,包括使用UnityProfiler或ProfileAnalyzer进行分析,减少GC影响,优化内存管理,如避免字符串操作,使用ScriptableObject或二进制格式存储数据,减少数组分配和拆装箱。此外,还提到了减少每帧运算,优化Awake/OnEnable/Start逻辑,使用对象池,正确导入纹理和网格,利用批处理技术,优化光照和阴影,以及UI性能提升等方面的方法。

检测工具:Unity Profiler或者是Profile Analyzer

注意:

  1. 尽早的进行性能分析,从开发初期便时刻关注

  1. 优化不要胡乱进行,配合工具找到准确的原因对症下药

  1. 完成编辑器的优化后,还需在实际运行环境或者最低规格设备环境上进行性能分析

内存-减少GC的影响:

  1. 减少不必要的字符串创建和操作,避免解析基于字符串的数据文件,如:jsonxml;改用 ScriptableObjectMessagePackProtobuf 等格式存储数据,字符串可使用StringBuilder替代

  1. 缓存数组引用,不要在循环中分配数组,使用某些避免产生垃圾的函数

  1. 缓存并重用 WaitForSeconds 对象,而不要在 yield 行中创建它,创建新的WaitForSeconds对象会产生垃圾

  1. 请避免使用 LINQ 和正则表达式

  1. 避免拆装箱操作

如果有可能,可以定时收集垃圾System.GC.Collect

使用增量式垃圾收集器拆分GC工作负载Editor-Project Settings-Player-Other Settings-

Use incremental GC

尽可能减少每帧运行的代码,不必要每帧运行的代码移出UpdateLateUpdateFixedUpdate或者每N帧执行一次

避免在Awake\OnEnable\Start中处理复杂的逻辑

避免空unity事件,把脚本中空的Update或者LateUpdate删除

发布前删除或者禁用所有的调试日志语句

不使用字符串名称对 AnimatorMaterial Shader 属性进行内部寻址。为了加快速度,所有属性名称都经过哈希处理为属性 ID,实际上是这些 ID 用于寻址属性

避免在运行时去添加组件

GameObject.FindGameObject.GetComponentCamera.main( 在 2020.2之前的版本中)可能开销较大,应避免在 Update 方法中调用它们。而应在 Start 中调用它们,并且缓存相应结果

考虑使用对象池

使用ScriptableObject,数据复用、配置文件、编辑器下数据持久性

降低或者禁用Accelerometer Frequency

禁用不必要的PlayerQuality设置,禁用不必要的物理设置

避免使用过多层级

正确导入纹理:

  1. 减少Max Size

  1. 正确的压缩格式

  1. 制作图集

  1. 关闭Read/Write Enable

  1. 禁用不必要Mip Map

正确导入网格:

  1. 适合的模型压缩级别

  1. 禁用Read\Write Enable

  1. 禁用骨骼和BlendShape

  1. 尽可能禁用法线和切线

使用可寻址资源系统Addressables

动态批处理,勾选Project Settings-Player-Dynamic Batching,仅支持顶点数小于900的网格物体,限制较多并且会浪费CPU去查找需处理的小网格

静态批处理,对于不移动物体使用,但需使用更多内存

GPU实例化,需材质支持,使用硬件进行有效批处理

SRP批处理,材质可以不同,但shader需要一样。项目使用脚本化渲染管道(SRP)

避免过多的动态光照,多考虑光照探针和烘培光照

禁用阴影,采用纹理伪阴影

对移动物体使用光照探针

使用LOD

使用遮挡剔除来移除隐藏的对象,将对象标记为静态遮挡物或被遮挡物,然后通过 Window > Rendering > Occlusion Culling 对话框进行烘焙

多个相机时,要进行合适的限制

避免绘制不必要的透明或半透明图像

限制后期处理效果

优化SkinnedMeshRenderer确保每一个使用SkinnedMeshRenderer的对象都是需要它的

尽可能减少反射探针

划分画布,将常更新的UI内容和不常更新的UI内容做画布区分

隐藏和禁用不可见的UI元素(组件),在需要时再显示

GraphicRaycaster用到需要使用点击的UI上,移除顶层的点击组件

在所有不需要 Raycast Target 的 UI 文本和图像上将其禁用

尽量避免使用布局组(Layout Group)

避免使用大型列表和网格视图,可考虑UI元素池

UI全屏遮挡时可以禁用摄像机对3D场景的渲染

确认是使用通用骨架还是人形骨架,如果非必要,最好使用通用骨架

避免过多使用Animator

PlayerSettings-Prebake Collision Meshes勾选上,用构建的时间换运行时的性能

请务必同时编辑 Physics 设置 (Project Settings > Physics)。尽可能简化 Layer Collision Matrix

禁用 Auto Sync Transforms 并启用 Reuse Collision Callbacks。

使用类方法(如 MovePositionAddForce)来移动 Rigidbody 对象。直接转换其 Transform 组件可能导致重新计算物理世界,在复杂场景中,这样需要较大开销。

FixedUpdate 中而不是 Update 中移动物理体。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值