赞
踩
检测工具:Unity Profiler或者是Profile Analyzer
注意:
尽早的进行性能分析,从开发初期便时刻关注
优化不要胡乱进行,配合工具找到准确的原因对症下药
完成编辑器的优化后,还需在实际运行环境或者最低规格设备环境上进行性能分析
内存-减少GC的影响:
减少不必要的字符串创建和操作,避免解析基于字符串的数据文件,如:json和xml;改用 ScriptableObject 或 MessagePack、Protobuf 等格式存储数据,字符串可使用StringBuilder替代
缓存数组引用,不要在循环中分配数组,使用某些避免产生垃圾的函数
缓存并重用 WaitForSeconds 对象,而不要在 yield 行中创建它,创建新的WaitForSeconds对象会产生垃圾
请避免使用 LINQ 和正则表达式
避免拆装箱操作
如果有可能,可以定时收集垃圾System.GC.Collect
使用增量式垃圾收集器拆分GC工作负载Editor-Project Settings-Player-Other Settings-
Use incremental GC
尽可能减少每帧运行的代码,不必要每帧运行的代码移出Update、 LateUpdate 和 FixedUpdate或者每N帧执行一次
避免在Awake\OnEnable\Start中处理复杂的逻辑
避免空unity事件,把脚本中空的Update或者LateUpdate删除
发布前删除或者禁用所有的调试日志语句
不使用字符串名称对 Animator、Material 和 Shader 属性进行内部寻址。为了加快速度,所有属性名称都经过哈希处理为属性 ID,实际上是这些 ID 用于寻址属性
避免在运行时去添加组件
GameObject.Find、GameObject.GetComponent 和 Camera.main( 在 2020.2之前的版本中)可能开销较大,应避免在 Update 方法中调用它们。而应在 Start 中调用它们,并且缓存相应结果
考虑使用对象池
使用ScriptableObject,数据复用、配置文件、编辑器下数据持久性
降低或者禁用Accelerometer Frequency
禁用不必要的Player或Quality设置,禁用不必要的物理设置
避免使用过多层级
正确导入纹理:
减少Max Size
正确的压缩格式
制作图集
关闭Read/Write Enable
禁用不必要Mip Map
正确导入网格:
适合的模型压缩级别
禁用Read\Write Enable
禁用骨骼和BlendShape
尽可能禁用法线和切线
使用可寻址资源系统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。
使用类方法(如 MovePosition 或 AddForce)来移动 Rigidbody 对象。直接转换其 Transform 组件可能导致重新计算物理世界,在复杂场景中,这样需要较大开销。
在 FixedUpdate 中而不是 Update 中移动物理体。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。