合批(Batching)在UE中的实现汇总

游戏引擎中的合批技术(Batching)是一种优化渲染性能的关键手段,其核心目标是减少绘制调用(Draw Call)次数,从而降低CPU与GPU之间的通信开销,提升帧率。


合批技术的基本原理

  1. Draw Call的瓶颈
    每次绘制一个物体时,CPU需要向GPU发送材质、网格、变换矩阵等数据,这个过程称为Draw Call。过多的Draw Call会导致CPU过载,成为性能瓶颈。

  2. 合批的核心思想
    将多个物体的渲染数据合并为一个或少量Draw Call,减少CPU与GPU之间的通信次数。合批成功的关键在于共享相同的渲染状态(如材质、纹理、Shader等)。

  3. 合批类型

    • 静态合批(Static Batching):合并不移动的物体(如场景中的静态建筑)。
    • 动态合批(Dynamic Batching):合并动态物体(如可移动的物体或材质参数需要经常变化的物体),但需要满足特定条件(如相同材质、顶点数限制)。
    • GPU Instancing:通过一次Draw Call渲染多个相同网格的实例,适用于大量重复物体(如草地、人群)。是一种更高级的动态合批。

静态合批(Static Batching)与动态合批(Dynamic Batching)的区别

特性静态合批动态合批
适用对象不移动、不变化的静态物体(如建筑、地形、固定装饰)。动态物体(如可移动、旋转、缩放的物体,或参数变化的实例)。
合批时机在编辑器或烘焙阶段预先合并(离线处理)。在运行时动态合并(实时处理)。
性能开销无运行时开销,合并后渲染效率极高。运行时需实时合并数据,可能增加CPU开销(需满足严格条件)。
灵活性合并后物体无法单独控制(如移动、隐藏)。保留实例独立性,支持动态修改参数。
内存占用合并后的网格占用更多内存(存储合并后的顶点数据)。内存占用较低(仅存储差异化参数)。
适用场景大规模静态场景(如城市、森林)。少量动态物体(如可破坏的箱子、动态植被)。
合批条件物体必须标记为静态(Static),使用相同材质和网格。需满足顶点数限制、相同材质、无复杂变换差异等条件。

Unreal Engine(UE)中的静态合批实现方法

UE主要通过以下技术实现静态合批:

1. HLOD(Hierarchical LOD)
  • 原理:将远距离的多个静态物体合并为简化的代理网格(Proxy Mesh),也就是将多个不同的Actor烘焙成一个SM,减少Draw Call。
  • 操作步骤
    1. 在编辑器中使用 HLOD Outliner 创建HLOD集群。
    2. 生成代理网格(支持自动或手动调整LOD层级)。
    3. 运行时根据摄像机距离切换原始模型与代理模型。
  • 适用场景:开放世界场景中优化远处物体渲染。
2. 手动合并Actor(Merge Actors)
  • 原理:将多个静态Actor合并为单个静态网格体,合并过程中可以选择简化材质数量以达到减少Draw Call的目的。底层原理和HLOD相同。
  • 操作步骤
    1. 在编辑器中选择多个静态Actor。
    2. 通过 Tools > Merge Actors 生成合并后的网格。
  • 注意事项
    • 合并后无法单独控制子物体(如动态交互、光照烘焙需重新处理)。
    • 合并后的网格可能增加内存占用。
3. 自动实例化(Auto Instancing)
  • 原理:自动检测场景中相同静态网格和材质的物体,合并为单个Draw Call。
  • 条件
    • 物体标记为 Static
    • 使用相同的 Static MeshMaterial Instance
  • 优化效果:适合处理大量重复静态物体(如路灯、石块)。
  • 注意事项
    • 此方法很笨,必须是相同的SM和相同的MI资产。如果MI复制多份分给长江中的相同SM,复制的MI参数不变,也会合批失败。

Unreal Engine(UE)中的动态合批实现方法

UE对动态合批的支持相对有限(主要依赖GPU Instancing),但可通过以下方式实现类似效果:

1. ISM(Instanced Staic Mesh)
  • 原理:通过GPU Instancing实现,每个实例的可变参数统一打包在一个Buffer中,渲染时按照实例ID去访问可变参数。
  • 实现步骤
    1. 在材质中启用 Use with Instancing
    2. 在场景中创建Instanced Staic Mesh Component
    3. 使用 PerInstanceCustomData 传递差异化参数(如颜色、缩放)。
    4. 在蓝图或C++中通过 SetCustomPrimitiveData 设置实例数据。
  • 适用场景:动态物体(如建筑、人群、车辆)。
2. CPD(Custom Primitive Data)
  • 原理:与ISM底层原理一致,只是一套不同的封装
  • 实现步骤
    1. 在母材质中需要Instance间可变的参数勾选 Use Custom Primitive Data
    2. 在场景中创建Static Mesh Component
    3. 在蓝图或C++中通过 SetCustomData 设置实例数据。
  • 适用场景:与ISM一致。
3. HISM(Hierarchical Instanced Staic Mesh)
  • 原理:在ISM的基础上对LOD管理进行的优化。ISM每个Instance独立计算LOD,放在如草地等植被上会开销巨大。HISM将场景中的实例按空间划分为层级结构(如四叉树或八叉树),实现高效剔除和切换LOD。
  • 实现步骤
    1. 在Actor蓝图中,通过Add Component选择 Hierarchical Instanced Static Mesh
    2. 在HISM组件的Details面板中,设置 Static Mesh 属性为需要实例化的网格(如树木、岩石)。
    3. 在HISM组件的Details面板中,点击 Add Instance 按钮,在场景中直接拖拽放置实例,或在蓝图中使用 Add Instance 节点动态添加实例,支持设置位置(Location)、旋转(Rotation)、缩放(Scale)。
  • 适用场景:植被系统。
特性HISMISM
剔除效率分层结构优化,支持高效视锥/遮挡剔除仅基础视锥剔除
LOD支持自动应用网格LOD,支持动态切换无内置LOD管理,需手动处理
适用场景超大规模静态物体(>1000实例)中小规模动态物体(<1000实例)
性能开销层级维护有额外CPU开销轻量级,适合频繁更新的实例
4. Niagara粒子系统(GPU粒子)
  • 原理:粒子系统默认使用GPU Instancing,将数万粒子合并为单个Draw Call。
  • 优势:支持动态参数(如位置、速度、颜色)实时变化。
  • 示例:火焰、雨雪、子弹轨迹。
5. 动画实例化(Animation Instancing)
  • 插件或自定义实现:通过共享骨骼动画数据,批量渲染动画模型(如人群)。
  • 插件推荐
    • Animation Budget Allocator(UE官方实验性插件)。
    • Mass AI(大规模人群渲染框架)。

性能注意事项

  1. 静态合批的代价
    • 合并后的网格可能导致光照烘焙复杂化(需重新展开UV)。
    • 内存占用增加(合并后的顶点/索引数据)。
  2. 动态合批的限制
    • GPU Instancing的顶点数量有上限,每个硬件平台可能不同,需要注意。
    • 频繁修改实例参数可能导致CPU开销上升。
  3. 调试工具
    • 使用 stat scenerendering 查看Draw Call数量。
    • 使用图形调试工具(如RenderDoc)观察Draw Call是否合并
### Unity UGUI 静态与动态的区别及用法 #### 一、静态 (Static Batching) 静态是一种通过预处理减少 Draw Calls 的技术。它适用于场景中位置固定的对象,这些对象不会频繁移动或改变。 - **原理**: 静态会将标记为静态的游戏对象并到单个网格中,在运行时作为单一绘制调用执行[^1]。这意味着即使多个游戏对象共享相同的材质和着色器,它们也会被组成一个次进行渲染。 - **优点**: - 减少 Draw Calls 数量,从而提高性能。 - 对于不经常变化的 UI 元素非常有效。 - **缺点**: - 如果对象的位置发生变化,则需要重新计算整个次,这可能会带来额外开销。 - 不适频繁更新或动画化的对象。 - **启用方式**: 在 Inspector 窗口中选中目标 GameObject 并勾选 `Static` 复选框即可将其纳入静态范围。 ```csharp // 设置物体为静态以便参与静态 GameObject gameObject; gameObject.isStatic = true; // 使用脚本设置静态标志 ``` --- #### 二、动态 (Dynamic Batching) 动态则针对那些可能随时发生变换的小型对象设计了一种实时优化方案。 - **原理**: 动态会在每帧自动检测符条件的小尺寸模型并尝试临时性地把他们打包在一起提交给 GPU 渲染管线完成一次性的顶点数据传输操作。注意这里强调的是“小型”,因为超过一定大小限制(通常约等于 900 vertices)之后就无法再加入此过程之中了。 - **优点**: - 自动化程度高,开发者无需手动干预太多细节配置工作就能享受到一定程度上的效率提升效果; - 更灵活适应各种复杂情况下的需求变更响应速度较快。 - **缺点**: - 受限于硬件能力以及软件内部实现机制约束等因素影响较大——比如当涉及到过多不同纹理贴图资源切换时候可能导致实际收益下降甚至适得其反的情况出现; - 单独依赖该功能而不考虑其他方面综因素的话也可能造成整体架构臃肿难以维护等问题存在风险隐患需要注意规避措施落实到位才行哦! - **条件要求**: * 所有要一起做dynamic-batch的对象都必须共用同一个Material实例(即完全一致而不是仅仅看起来相似而已); * 它们的Transform矩阵也应当保持相对简单结构形式才有利于算法高效运作发挥最大潜力价值所在之处体现出来呢! --- ### 总结对比表 | 特性 | Static Batching | Dynamic Batching | |--------------------|------------------------------------|-----------------------------------| | **适用对象** | 场景中的静止不动物件 | 小规模可变位移实体 | | **初始化成本** | 较高 | 极低 | | **运行期间消耗** | 很低 | 中等至较高 | | **灵活性** | 差 | 好 | 以上就是关于Unity引擎下UGUI系统的两种主要类型的Batching介绍及其各自特点分析说明啦~希望对你有所帮助吧😊 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值