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

检测工具: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 中移动物理体。

猜你喜欢

转载自blog.csdn.net/Bug1997/article/details/128564919