Unity 性能优化涉及CPU、GPU、内存、包体、加载五大维度,需要系统性地分析和处理。一、性能分析工具(优化前提)1. Unity Profiler(核心)Window → Analysis → ProfilerCPU Usage:脚本、渲染、物理、GCGPU Usage:DrawCall、着色器Memory:堆内存、资源占用Rendering:批处理、三角面数Physics / Audio / UI:分模块分析2. 其他工具工具用途Frame Debugger逐 DrawCall 分析渲染Memory Profiler(Package)深度内存快照分析Profile Analyzer帧数据对比分析RenderDoc底层图形调试XCode InstrumentsiOS 真机分析Android Studio ProfilerAndroid 真机分析Snapdragon Profiler高通芯片专用⚡原则:先测量,再优化。不要盲目优化,先定位瓶颈。二、CPU 优化1. 脚本层面❌ 避免的做法// 每帧 GetComponentvoidUpdate(){GetComponentRigidbody().velocity...;// 昂贵}// 字符串拼接stringsScore: score;// 产生 GC// Camera.main 每帧调用Camera.main.transform.position;// 内部是 FindWithTag✅ 推荐做法privateRigidbodyrb;privateCameramainCam;privateStringBuildersbnewStringBuilder();voidAwake(){rbGetComponentRigidbody();// 缓存mainCamCamera.main;}2. Update 优化减少Update()中的逻辑,能事件驱动就不轮询用管理器统一 Tick,替代大量 MonoBehaviour Update分帧执行:每 N 帧处理一次使用协程 / Job System / Async拆分耗时任务// 分帧处理voidUpdate(){if(Time.frameCount%50)DoHeavyWork();}3. GC 优化(重点!)GC 卡顿是移动端性能大敌GC 产生的常见原因操作替代方案new频繁分配对象池字符串拼接StringBuilder/string.Format少用foreach 某些容器for 循环Lambda 闭包变量捕获静态委托.ToArray()/.ToList()预分配容器装箱(值类型→object)泛型Debug.LogRelease 剔除对象池示例publicclassObjectPoolTwhereT:Component{StackTpoolnewStackT();Tprefab;publicTGet(){returnpool.Count0?pool.Pop():Instantiate(prefab);}publicvoidRelease(Tobj){obj.gameObject.SetActive(false);pool.Push(obj);}}4. 物理优化减少 Rigidbody 数量,静态物体不加使用简单碰撞体(Box/Sphere Mesh Collider)降低Fixed Timestep(默认 0.02,移动端可 0.033)分层碰撞矩阵:Project Settings → Physics → Layer Collision Matrix关闭不必要的 Auto Sync Transforms5. 使用 Job System Burst[BurstCompile]structMyJob:IJobParallelFor{publicNativeArrayfloatdata;publicvoidExecute(inti){data[i]math.sqrt(data[i]);}}适用大量并行计算,性能提升可达10x。三、GPU / 渲染优化1. DrawCall 优化手段说明静态批处理静态物体勾选 Static,合批动态批处理小于 300 顶点自动合批GPU Instancing相同 Mesh Material,材质勾选 Enable InstancingSRP BatcherURP/HDRP 下大幅提升批处理图集(Atlas)减少纹理切换合并 MeshMesh.CombineMeshes2. Overdraw 优化减少半透明物体重叠UI 避免大面积透明像素Scene 视图 → Overdraw 模式查看3. 纹理优化平台推荐压缩格式AndroidASTC(推荐)/ ETC2iOSASTC / PVRTCPCDXT5 / BC7纹理尺寸2 的幂次方不需要的关闭 Read/Write、Mipmap大图用 Sprite AtlasMax Size 按需设置(UI 图标不必 2048)4. 模型优化减面:移动端角色 3k-10k 面为宜LOD(Level of Detail):远处用低模Occlusion Culling(遮挡剔除)Frustum Culling(视锥剔除,自动)骨骼数:移动端建议 325. Shader 优化移动端避免复杂计算(pow、exp、if 分支)减少纹理采样数量使用half / fixed替代 floatShader Variant Collection预热,避免运行时编译卡顿关闭不必要的 Keyword6. 光照优化烘焙光照(Baked)替代实时光Light Probe处理动态物体Reflection Probe少用或烘焙移动端实时光源建议 ≤ 1 个平行光关闭阴影或使用低质量阴影7. 后处理移动端谨慎使用 Bloom、SSAO、DOF使用 URP 而非内置 / HDRP(移动端场景)四、内存优化1. 资源内存资源优化点纹理最大占内存,压缩 尺寸控制音频短音效 Decompress on Load,BGM Streaming网格关闭 Read/Write Enabled动画关闭 Optimize GameObjects 之外的曲线2. 内存泄漏排查常见泄漏点:AssetBundle 未 Unload静态引用未释放事件订阅未取消(event - handler)Texture、Material 动态创建未 Destroy// 手动释放Destroy(texture);Resources.UnloadUnusedAssets();System.GC.Collect();// 慎用,可能卡顿3. 资源加载策略Addressables管理引用计数场景切换时卸载无用资源大资源按需加载,不预加载五、UI 优化(UGUI)1. Canvas 拆分静态元素 动态元素分开放不同 Canvas一个元素变化会导致整个 Canvas 重建(Rebatch)2. 避免 Rebuild 触发不要频繁修改 UI 元素的 SetActive使用移出屏幕替代 SetActive(false)关闭 Raycast Target(不需要点击的图片)3. 其他要点用Sprite Atlas合并图集少用 Layout Group / Content Size Fitter(触发多次布局)大列表用循环列表(Loop Scroll)TextMeshPro替代默认 TextMask 慎用,用 RectMask2D 替代六、加载优化1. 启动加载Splash 时预加载核心资源场景加载用LoadSceneAsync异步AssetBundle 预热Shader 预热:ShaderVariantCollection.WarmUp()2. 场景切换AsyncOperationopSceneManager.LoadSceneAsync(Level1);op.allowSceneActivationfalse;// 加载完不立即切换// 显示进度条while(op.progress0.9f){progressop.progress;yieldreturnnull;}op.allowSceneActivationtrue;3. 资源加载异步加载 分帧实例化Instantiate 大量物体用对象池分帧使用Addressables 预加载七、包体优化1. 查看包体构成Build 后查看Editor.log,能看到各类资源占比。2. 缩减手段纹理压缩(占比最大)音频压缩:Vorbis 格式模型压缩:Mesh Compression High代码剥离:Managed Stripping Level HighIL2CPP 剥离未使用代码移除未用的插件、DLL分包:主包 热更资源八、移动端专项优化1. 帧率控制Application.targetFrameRate30;// 或 60QualitySettings.vSyncCount0;2. 发热与耗电帧率降到 30(动作类保留 60)减少后处理减少 Overdraw静止时降低刷新率3. 分辨率缩放Screen.SetResolution(1280,720,true);// 低端机降分辨率// URP: Render Scale九、优化检查清单 ✅通用用 Profiler 定位瓶颈Release 移除 Debug.Log关闭不必要的 Update缓存组件引用渲染静态物体勾选 Static开启 GPU Instancing / SRP Batcher纹理压缩到位光照烘焙Overdraw 检查LOD / Occlusion Culling内存关闭 Mesh Read/Write音频加载模式合理AB 引用计数管理UICanvas 动静分离关闭无用 Raycast TargetTextMeshPro大列表循环利用GC对象池避免字符串拼接消除装箱包体代码剥离资源压缩移除未用资源十、优化思路总结1. 测量 → 定位瓶颈(Profiler) 2. 分析 → 判断 CPU/GPU/内存/IO 3. 优化 → 有针对性处理 4. 验证 → 真机对比数据 5. 迭代 → 循环改进优化的核心:先真机测量,再针对性优化,避免过早优化。