跳到主要内容

合批

合批是将多个网格实例合并为单个网格实例,使其可通过一次 GPU 绘制调用完成渲染的过程。PlayCanvas 在模型、精灵和元素组件上提供便捷功能,可将组件分配到合批组,向引擎提示如何组合网格,以减少总绘制调用数。

引擎会应用多种规则判断网格实例能否合并。首要规则是所有实例必须共享相同材质。

常见合批用途包括:

  • 将环境等静态几何体合并为一个或多个较大的网格实例,减少绘制调用,同时保留相机剔除能力。
  • 将一组移动对象等动态几何体合并为单个网格实例,其动态属性在 GPU 上应用。
备注

目前合批与运行时光照贴图不兼容,因为每个使用光照贴图的对象都需要独立纹理。

创建合批组​

创建合批组

可在场景设置面板的 Batch Groups(合批组)部分创建合批组。每个组具有一组属性,向引擎提示如何将组内对象生成批次。

合批组属性​

  • Name(名称):区分不同合批组,最好描述组内对象的类型。运行时可通过该名称获取组。
  • Dynamic(动态):启用后,组内对象仍可移动、旋转和缩放。适用于子弹等相似且使用相同材质的对象。静态组的运行时资源开销更低,因此组内内容不移动时应禁用此选项。
  • Max AABB size(最大包围盒尺寸):创建批次时,包含组内所有对象的包围盒任一边允许的最大长度。如果网格集合超出最大尺寸,会拆分为多个批次渲染。较大的包围盒能减少绘制调用,但相机剔除效果较差。

将组件添加到合批组​

选择合批组

模型组件具有 Batch Group 属性,可将模型分配到合批组。

合并网格实例的规则​

引擎判断能否合并网格实例的规则比较复杂,概括而言,属于同一批次的所有网格实例必须满足:

  • 具有相同的合批组 ID。
  • 具有相同材质。
  • 具有相同着色器参数。
  • 位于任一边均不超过 Max AABB Size 的包围盒内。
  • 位于同一图层。
  • 每批最多 65535 个顶点。
  • 动态批次的可移动网格实例数量有上限,取决于硬件,最高为 1024。

如果合批组中的组件或网格实例不满足全部规则,该组会生成多个批次,使每个批次内部的实例都符合所有规则。

触发重新合批​

引擎根据合批组创建优化后的网格实例。此后对原始网格实例许多属性的修改,不会反映到优化版本中。为了兼顾合批性能与后续更新,可在修改原始实例后请求引擎重新合批指定组。这对 UI 元素组件很有用:通常希望合批,但仍需偶尔更新。注意,重新合批可能开销较大。许多情况下,将需要更新的元素放入独立合批组,可减小影响。

下面是简单脚本示例:更新元素的 textureAsset,并将合批组标记为脏。

// change textureAsset on element
element.textureAsset = this.hoverAsset;

// if this element has Batch Group set, mark it dirty to rebuild the group in the next frame
if (element.batchGroupId)
this.app.batcher.markGroupDirty(element.batchGroupId);

示例:对静态环境合批​

西部场景

此场景由 7 个独立模型文件构建静态环境,其中部分模型在场景中重复使用。例如,路面块用于 50 个实体,组成穿过场景中央的长路。

西部场景绘制动画

动画显示了每次绘制调用。在此环境中,引擎需要超过 50 次绘制调用,逐个绘制模型。但除地面外,所有模型都使用同一材质,因此可以加入合批组。

合批后的西部场景动画

此动画为建筑、仙人掌、道路和地面创建了 4 个合批组。注意,道路和地面未各自合并为单次绘制调用,因为网格范围超过了合批组定义的 Max AABB Size。

术语​

  • 合批组(Batch Group):在编辑器中创建的命名组,定义网格实例如何合并的提示。组件分配到合批组。
  • 批次(Batch):运行时创建的引擎对象,表示一次绘制调用渲染的一组网格实例。根据加入组内实例的属性,一个合批组可能生成多个批次。
  • 合批管理器(Batch Manager):运行时创建和更新批次的编程接口。参见 API 文档。