ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

静态合批(Static Batching):Unity 的“免费午餐“优化

静态合批(Static Batching):Unity 的“免费午餐“优化 开场一个勾个框就变快的魔法小王的场景里放了 500 个石头、树木、栅栏…帧率只有 30DrawCall 高达 500老鸟走过来什么代码都没写只是把这些物体右上角的“Static”框全勾上了。“叮”DrawCall 从 500 掉到了 30帧率飙到 60小王惊呆“就勾个框这也太爽了吧”这就是静态合批—— Unity 送你的免费性能午餐 第一幕静态合批是什么一句话定义静态合批 Unity自动把不会动的物体 合并成大网格减少DrawCall 你只需要勾选Static Unity自动帮你合并和手动合并的关系还记得上一讲的手动合并网格吗 静态合批 Unity帮你自动做手动合并的事 手动合并你写代码把顶点烘焙成世界坐标 静态合批Unity自动把静态物体烘焙合并 ↓ 原理一模一样只是Unity帮你做了生动比喻自动打包手动合并 自己把100个快递打包成1箱 (费时费力写代码) 静态合批 贴个静态标签 Unity的机器人自动帮你打包 (勾个框就行) 第二幕核心前提——Static到底啥意思Static “我保证永远不动”勾选Static 你向Unity承诺 这个物体永远不会移动、旋转、缩放 ↓ Unity: 既然你不动我就放心地 把你的位置焊死、合并进大网格为什么不动是前提还记得合并的原理吗 位置被烘焙进顶点(世界坐标焊死) ↓ 一旦焊死就动不了了 ↓ 所以只有承诺不动的物体 才能被烘焙合并 ↓ 这就是为什么叫静态合批生动理解就像水泥浇筑 动态物体 活动的家具(能搬) 静态物体 浇进水泥的柱子(焊死了) 一旦浇进水泥(合并) 柱子就永远在那了不能动 ↓ 所以只浇筑确定不动的东西️ 第三幕如何开启静态合批超简单的操作第1步选中不会动的物体 (墙、地面、石头、树、建筑...) 第2步Inspector右上角 勾选 Static ✓ (或点旁边小箭头只勾Batching Static) 第3步完事 Unity自动处理运行时生效Static 的细分选项点Static旁边的小箭头有多个选项 ☑ Batching Static ← 静态合批用这个 ☐ Occluder Static (遮挡剔除) ☐ Occludee Static ☐ Navigation Static (寻路) ☐ Lightmap Static (光照贴图) ... 只要合批勾 Batching Static 即可 勾Everything也行(全都要)界面示意┌──────────────────────────────┐ │ Rock_01 Static ▼ ☑ │ ← 勾这里 ├──────────────────────────────┤ │ 点开▼ │ │ ☑ Contribute GI │ │ ☑ Occluder Static │ │ ☑ Batching Static ← 关键 │ │ ☑ Navigation Static │ │ ... │ └──────────────────────────────┘也可以开启项目级设置Edit → Project Settings → Player → Other Settings → ☑ Static Batching (确保勾选) 一般默认是开的检查一下 第四幕静态合批的底层原理Unity 在背后做了什么你勾选Static后Unity在构建/运行时 第1步找出所有Static 相同材质的物体 第2步把它们的顶点 用各自Transform烘焙成世界坐标 第3步合并成一个(或几个)大网格 第4步渲染时一次DrawCall画完关键合并的是相同材质的和手动合并一样的限制 静态物体们 用材质A的 → 合并成大网格1 用材质B的 → 合并成大网格2 ↓ 不同材质无法合进同一批图解场景里的静态物体 石头(材质A) 树(材质B) 石头(材质A) 树(材质B) 静态合批后 批次1: 所有材质A的石头 → 1次DrawCall 批次2: 所有材质B的树 → 1次DrawCall ↓ 原本4次DrawCall → 变成2次 (材质相同的合到一起) 第五幕静态合批 vs 动态合批两者核心区别【静态合批】 时机构建/加载时合并一次 对象不动的物体(Static) 代价占用额外内存(存合并网格) 性能CPU开销小(只合并一次) 【动态合批】 时机每一帧都重新合并 对象会动的小物体 代价每帧CPU计算 性能CPU开销大(帧帧都算)生动对比静态合批 提前把砖砌成墙(一劳永逸) 之后每帧直接用现成的墙 动态合批 每帧临时把砖摆成墙 用完拆掉下帧再摆 (因为砖会动位置每帧变)为什么动态的要每帧合并动态物体会动 ↓ 它的世界坐标每帧都在变 ↓ 不能提前烘焙(烘焙了就不能动了) ↓ 只能每帧临时算、临时合并 ↓ 所以动态合批开销大限制多对比表静态合批 动态合批 ───────────────────────────────── 对象 不动物体 小型动态物体 合并时机 一次(加载时) 每帧 CPU开销 低 高(逐帧) 内存开销 高(存网格) 低 顶点限制 基本没有 严格(900属性) 推荐度 ⭐⭐⭐⭐⭐ ⭐⭐(慎用)⚠️ 第六幕静态合批的坑与限制坑1内存膨胀❌ 问题 静态合批会复制网格数据 ↓ 1000个相同的石头 本来共用1份网格 合批后可能变成1000份世界坐标数据 ↓ 内存暴涨✅ 解决 - 大量完全相同的物体 用GPU Instancing更好(不复制网格) - 静态合批适合各不相同的静态物体坑2勾了Static却还能动❌ 危险操作 勾了Static又在代码里移动它 ↓ 物体位置已烘焙焊死 ↓ 视觉上不动或者错乱(穿帮)✅ 铁律 勾了Static 绝对不能动 要动的物体千万别勾Static坑3材质不同还是分批❌ 误解 我全勾Static了怎么DrawCall没降多少 原因 物体材质各不相同 ↓ 不同材质无法合到一批 ↓ 勾了也没用✅ 解决 先用贴图图集统一材质 让更多物体能合到一批坑4失去独立剔除❌ 问题 合批后是一体网格 远处看不见的部分也可能被渲染 ↓ (和手动合并一样的代价)✅ 权衡 - 小场景合批利大于弊 - 大场景配合遮挡剔除等技术 第七幕实战效果验证用 Frame Debugger 观察Window → Analysis → Frame Debugger 开启后可以看到 - 每次DrawCall画了什么 - 静态合批把哪些物体合到了一起 - 显示Static Batch批次用 Stats 面板看效果Game视图右上角 → Stats 关注 Batches: 总批次数 Saved by batching: 合批省下的DrawCall数 ↓ 勾Static前后对比这个数字 就知道效果了真实优化案例优化前 - 500个静态场景物体 - Batches: 500 - 帧率: 30 FPS 勾选Static后 - Batches: 约30(相同材质合并) - Saved by batching: 470 - 帧率: 60 FPS ✅ 一个勾选性能翻倍 第八幕什么该用静态合批✅ 适合静态合批✓ 场景建筑(墙、地板、天花板) ✓ 固定装饰(雕像、家具) ✓ 地形装饰(石头、栅栏) ✓ 任何摆好就不动的物体 ✓ 各不相同的静态物体❌ 不适合静态合批✗ 会移动的物体(角色、载具、门) ✗ 会旋转的物体(风车、齿轮) ✗ 大量完全相同的物体 → 用GPU Instancing更省内存 ✗ 需要频繁开关的物体决策流程图物体会动吗 ├─ 会动 → 别用静态合批 │ (考虑动态合批/GPU Instancing) │ └─ 不动 → 大量完全相同吗 ├─ 是 → GPU Instancing(省内存) └─ 否 → 静态合批勾Static ✓️ 第九幕进阶——提升合批效果技巧1统一材质让更多物体能合到一批 1. 用贴图图集(Atlas) 多张贴图 → 一张大图 2. 物体共用同一材质 ↓ 原本因材质不同无法合批的 现在都能合到一起技巧2合理规划Static把场景物体分类 永久不动 → 勾Static 偶尔动 → 别勾(用其他优化) 不要图省事全勾 会动的勾了会出bug技巧3注意内存监控勾大量Static后 用Profiler看内存 如果内存暴涨 ↓ 说明网格复制太多 考虑改用GPU Instancing ↓ 在DrawCall和内存间权衡技巧4结合遮挡剔除静态合批 Occlusion Culling 合批减DrawCall 遮挡剔除减少渲染看不见的 ↓ 两者配合弥补合批失去独立剔除的缺点✅ 静态合批检查清单使用前 □ 物体确定永远不动吗 □ 物体材质相同吗(能合批) □ 是否大量完全相同(该用Instancing) 设置 □ 勾选了Batching Static □ Project Settings里Static Batching开启 □ 会动的物体没误勾Static 验证 □ Stats面板Batches降了吗 □ Saved by batching有数值吗 □ Frame Debugger看到合批了吗 □ 内存是否可接受 □ 帧率提升了吗 一句话总结静态合批的核心勾选Static 向Unity承诺我永远不动Unity自动把相同材质的静态物体烘焙合并成大网格减少DrawCall。优点几乎零成本(勾个框)效果显著代价占用额外内存失去独立剔除。适合摆好就不动的场景物体会动的千万别勾大量相同的用Instancing核心口诀勾框承诺不动同材质自动合换内存减调用动的别勾会穿帮 三大合批技术全景对比特性静态合批动态合批GPU Instancing对象不动物体小动态物体大量相同物体原理烘焙合并网格每帧合并一次画多个网格复制(费内存)临时合并共用(省内存)CPU低高(逐帧)低内存高低低限制需不动顶点数限制需相同网格操作勾Static自动/勾选材质勾选推荐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐ 现代Unity项目还有SRP Batcher可编程渲染管线批处理用另一种思路优化甚至能处理不同材质
返回列表