先定位瓶颈,再动手优化。 优化没有被卡住的环节,等于白费力气,甚至可能因增加复杂度而变慢。
性能优化不是"把所有东西都做快",而是找到当前限制帧率的那一环,针对性地解决它。所以任何优化都应从测量(Profiling) 开始,而非凭直觉。
| 瓶颈 | 典型现象 | 常用工具 |
|---|
| CPU 瓶颈 | GPU 在等 CPU 喂数据;主线程满 | Unity Profiler、Tracy、火焰图 |
| GPU 瓶颈(计算/填充) | GPU 满载、CPU 空闲 | RenderDoc、Nsight、PIX、GPU 时间轴 |
| 带宽瓶颈 | 算力没满但卡在读写 | 厂商工具的带宽计数器 |
| 内存/GC | 卡顿、爆显存、频繁 GC | Memory Profiler |
| 加载 | 关卡切换/流式时卡顿 | Profiler 时间线、IO 分析 |
CPU 瓶颈通常来自"逐物体的准备与提交"和"主线程的逻辑/GC"。
| 方向 | 手段 | 相关专题 |
|---|
| Draw Call / 提交 | 合批、GPU 实例化、GPU 驱动渲染 | GPU Resident Drawer |
| 剔除 | 视锥剔除、遮挡剔除、LOD、距离剔除 | 渲染管线架构 |
| 数据布局 | 数据导向设计(DOD)/ ECS、缓存友好、SIMD | — |
| 多线程 | Job System、渲染线程与逻辑线程分离、无锁 | — |
| 脚本 / GC | 避免每帧堆分配、对象池、减少 GC 停顿 | — |
| 方向 | 手段 | 相关专题 |
|---|
| 渲染路径 | 前向 / 延迟 / Forward+ 的选择 | 渲染管线架构 |
| Overdraw / 填充率 | 半透明排序、Early-Z、Depth Pre-pass | 渲染管线架构 |
| Shader | 指令数、寄存器/占用率、变体管理 | Shader 变体爆炸 |
| 几何 | LOD、虚拟几何、网格简化 | 虚拟几何体 |
| 光照 / 阴影 | Shadow Map 分辨率与级联、光源数量、GI 方案 | — |
| 抗锯齿 / 后处理 | 选对 AA 方案、超分(DLSS/FSR/TSR) | 抗锯齿方法 |
| 自适应 | VRS(可变速率着色)、动态分辨率缩放 | — |
| 方向 | 手段 |
|---|
| 纹理 | 压缩格式(ASTC/BC)、Mipmap、纹理流式、图集 |
| 带宽 | 减少 RT 数量与格式(G-Buffer 瘦身)、移动端片上驻留 |
| 显存预算 | 资源常驻策略、按需加载、LOD 内存 |
| 分配器 | 池 / 栈 / 环形分配器,减少碎片与运行时分配 |
| 方向 | 手段 | 相关专题 |
|---|
| 资源打包 / 热更 | AssetBundle、Addressables | AssetBundle 系统 |
| 流式加载 | 场景/纹理/几何按需加载,常驻量与总量解耦 | 虚拟几何体(几何流式) |
| 异步 / 预加载 | 后台加载、预热 | — |
| PSO / 着色器预缓存 | 对抗运行时着色器编译卡顿 | Shader 变体爆炸 |
| 子系统 | 优化点 |
|---|
| 物理 | 碰撞检测粒度、BVH、固定步长、休眠(sleeping) |
| 动画 | GPU Skinning、动画压缩、LOD 动画、Motion Matching 开销 |
| 音频 | 声源数量、DSP 负载、距离剔除 |
| UI | 减少重建批次、控制 Overdraw(移动端隐形杀手) |
| 网络 | 同步策略、序列化开销、带宽控制 |
移动端不是"缩小版 PC",有独特的优化重心:
- TBR / TBDR 架构:避免不必要的 RT load/store,用
memoryless / transient 附件。 - 发热与降频(Thermal Throttling):目标是长时间稳定帧率,而非瞬时峰值。
- 功耗:同样画面下更省电,直接影响续航与口碑。
- 带宽敏感:移动 GPU 带宽远小于桌面,纹理压缩、减少全屏 Pass 尤为重要。
| 优化维度 | 本工作区专题文档 |
|---|
| Draw Call / CPU 提交 | GPU Resident Drawer |
| 渲染路径 / Overdraw / Early-Z | 渲染管线架构 |
| Shader 编译 / 内存 / 卡顿 | Shader 变体爆炸 |
| 几何 / LOD | 虚拟几何体 |
| 抗锯齿 / 后处理 / 移动端带宽 | 抗锯齿方法 |
| 资源加载 / 热更 / 内存 | AssetBundle 系统 |
| 误区 | 正解 |
|---|
| 凭直觉优化,不测量 | 先 Profiling 定位真正瓶颈 |
| 过早优化(premature optimization) | 先保证正确与可读,热点出现再优化 |
| 优化了没被卡住的环节 | CPU 瓶颈时优化 GPU 毫无意义 |
| 只看平均帧率 | 更要看帧时间的稳定性(1% Low、卡顿尖峰) |
| 在编辑器里测性能 | 以真机 / 最终构建为准(编辑器有额外开销) |
| 微优化压倒架构 | 算法/架构(如 DOD、GPU 驱动)的收益远大于局部微调 |
| 你观察到 | 优先排查 |
|---|
| Draw Call / SetPass 很高 | 合批、实例化、GPU Resident Drawer |
| GPU 满载、画面复杂 | Overdraw、Shader 复杂度、分辨率、后处理 |
| 带宽满 | RT 数量/格式、纹理压缩、移动端片上驻留 |
| 卡顿尖峰 | GC、着色器编译(PSO)、同步加载 |
| 爆显存 | 纹理/网格流式、LOD、常驻策略 |
| 关卡切换慢 | 异步加载、AssetBundle 组织、预加载 |
| 移动端发热掉帧 | 降带宽、降分辨率、稳定帧率而非峰值 |
游戏引擎性能优化的核心方法论是先测量、后优化,通过 Profiling 准确定位 CPU/GPU/内存/加载等瓶颈类型,再针对性地选择优化手段。CPU 侧优化聚焦于 Draw Call 提交、剔除、数据布局与多线程;GPU 侧优化涉及渲染路径、Shader 变体、几何 LOD、光照阴影与抗锯齿方案;内存与带宽方面需关注纹理压缩、RT 瘦身与分配器策略;加载与流式层面则依赖资源打包、异步加载与 PSO 预缓存。移动端平台需特别关注 TBR/TBDR 架构下的带宽控制、发热降频与功耗管理。优化应以帧时间稳定性(1% Low)为目标,避免过早优化、直觉优化以及在编辑器而非真机上评估等常见误区。