MyBatis动态SQL实战:告别SQL拼接,构建灵活高效的数据访问层
2026/8/9 2:13:54
Unity 性能优化涉及CPU、GPU、内存、包体、加载五大维度,需要系统性地分析和处理。
Window → Analysis → Profiler| 工具 | 用途 |
|---|---|
| Frame Debugger | 逐 DrawCall 分析渲染 |
| Memory Profiler(Package) | 深度内存快照分析 |
| Profile Analyzer | 帧数据对比分析 |
| RenderDoc | 底层图形调试 |
| XCode Instruments | iOS 真机分析 |
| Android Studio Profiler | Android 真机分析 |
| Snapdragon Profiler | 高通芯片专用 |
⚡原则:先测量,再优化。不要盲目优化,先定位瓶颈。
// 每帧 GetComponentvoidUpdate(){GetComponent<Rigidbody>().velocity=...;// 昂贵}// 字符串拼接strings="Score: "+score;// 产生 GC// Camera.main 每帧调用Camera.main.transform.position;// 内部是 FindWithTagprivateRigidbodyrb;privateCameramainCam;privateStringBuildersb=newStringBuilder();voidAwake(){rb=GetComponent<Rigidbody>();// 缓存mainCam=Camera.main;}Update()中的逻辑,能事件驱动就不轮询// 分帧处理voidUpdate(){if(Time.frameCount%5==0)DoHeavyWork();}GC 卡顿是移动端性能大敌
| 操作 | 替代方案 |
|---|---|
new频繁分配 | 对象池 |
| 字符串拼接 | StringBuilder/string.Format少用 |
| foreach 某些容器 | for 循环 |
| Lambda 闭包变量捕获 | 静态委托 |
.ToArray()/.ToList() | 预分配容器 |
| 装箱(值类型→object) | 泛型 |
Debug.Log | Release 剔除 |
publicclassObjectPool<T>whereT:Component{Stack<T>pool=newStack<T>();Tprefab;publicTGet(){returnpool.Count>0?pool.Pop():Instantiate(prefab);}publicvoidRelease(Tobj){obj.gameObject.SetActive(false);pool.Push(obj);}}Fixed Timestep(默认 0.02,移动端可 0.033)[BurstCompile]structMyJob:IJobParallelFor{publicNativeArray<float>data;publicvoidExecute(inti){data[i]=math.sqrt(data[i]);}}适用大量并行计算,性能提升可达10x+。
| 手段 | 说明 |
|---|---|
| 静态批处理 | 静态物体勾选 Static,合批 |
| 动态批处理 | 小于 300 顶点自动合批 |
| GPU Instancing | 相同 Mesh + Material,材质勾选 Enable Instancing |
| SRP Batcher | URP/HDRP 下大幅提升批处理 |
| 图集(Atlas) | 减少纹理切换 |
| 合并 Mesh | Mesh.CombineMeshes |
| 平台 | 推荐压缩格式 |
|---|---|
| Android | ASTC(推荐)/ ETC2 |
| iOS | ASTC / PVRTC |
| PC | DXT5 / BC7 |
| 资源 | 优化点 |
|---|---|
| 纹理 | 最大占内存,压缩 + 尺寸控制 |
| 音频 | 短音效 Decompress on Load,BGM Streaming |
| 网格 | 关闭 Read/Write Enabled |
| 动画 | 关闭 Optimize GameObjects 之外的曲线 |
常见泄漏点:
event -= handler)// 手动释放Destroy(texture);Resources.UnloadUnusedAssets();System.GC.Collect();// 慎用,可能卡顿LoadSceneAsync异步ShaderVariantCollection.WarmUp()AsyncOperationop=SceneManager.LoadSceneAsync("Level1");op.allowSceneActivation=false;// 加载完不立即切换// 显示进度条while(op.progress<0.9f){progress=op.progress;yieldreturnnull;}op.allowSceneActivation=true;Build 后查看Editor.log,能看到各类资源占比。
Application.targetFrameRate=30;// 或 60QualitySettings.vSyncCount=0;Screen.SetResolution(1280,720,true);// 低端机降分辨率// URP: Render Scale1. 测量 → 定位瓶颈(Profiler) 2. 分析 → 判断 CPU/GPU/内存/IO 3. 优化 → 有针对性处理 4. 验证 → 真机对比数据 5. 迭代 → 循环改进🎯优化的核心:先真机测量,再针对性优化,避免过早优化。