BatchedMesh是 Three.js 中一种用于批处理多个网格(Mesh)的技术,主要目的是提高渲染性能。通过将多个具有相同材质的几何体合并为一个网格来减少 WebGL 渲染的 draw call 数量,从而提高性能。这在渲染场景中有大量重复对象时非常有用。
BatchedMesh 有六个属性十二个方法
BatchedMesh( maxInstanceCount : Integer, maxVertexCount : Integer, maxIndexCount : Integer, material : Material, ) maxInstanceCount - 计划添加的单个几何体的最大数量。 maxVertexCount - 所有几何体使用的最大顶点数。 maxIndexCount - 所有几何图形使用的最大索引数。 material - Material 的一个实例。默认是新的 MeshBasicMaterial。
基础使用示例
// 创建几何体
const box = new THREE.BoxGeometry(1, 1, 1);
const sphere = new THREE.SphereGeometry(0.5, 32, 32); // 修正为球体几何体
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
// 初始化并添加几何体到批量网格中
const batchedMesh = new THREE.BatchedMesh(10, 5000, 10000, material);
const boxId = batchedMesh.addInstance(batchedMesh.addGeometry(box));
const sphereId = batchedMesh.addInstance(batchedMesh.addGeometry(sphere));
// 设置几何体的位置
const boxMatrix = new THREE.Matrix4().makeTranslation(-1.5, 0, 0); // 将方块放置到左侧
const sphereMatrix = new THREE.Matrix4().makeTranslation(1.5, 0, 0); // 将球体放置到右侧
batchedMesh.setMatrixAt(boxId, boxMatrix);
batchedMesh.setMatrixAt(sphereId, sphereMatrix);
// 将批量网格添加到场景中
scene.add(batchedMesh);
// 计算批处理后的 boundingBox
batchedMesh.computeBoundingBox();
// 获取 BatchedMesh 的 boundingBox
console.log(batchedMesh.boundingBox); // { "isBox3": true, "min": { "x": -2, "y": -0.5, "z": -0.5 }, "max": { "x": 2, "y": 0.5, "z": 0.5 } }
// 计算批处理后的 boundingSphere
batchedMesh.computeBoundingSphere();
// 获取 BatchedMesh 的 boundingSphere
console.log(batchedMesh.boundingSphere); // { "isSphere": true, "center": { "x": -0.18301269236086037, "y": 0, "z": 0 }, "radius": 2.1830127114235784 }
属性
- boundingBox : Box3 该边界框包围了 BatchedMesh 的所有实例。可以用 .computeBoundingBox() 进行计算。默认为 null。
- boundingSphere : Sphere 该边界球包围了 BatchedMesh 的所有实例。可以用 .computeBoundingSphere() 进行计算。默认为 null。
- perObjectFrustumCulled : Boolean 如果为 true,则 BatchedMesh 内的各个对象将被视锥体剔除。默认为 true。
性能影响:当 perObjectFrustumCulled 为 true 时,会有额外的计算开销,因为每个子对象都需要进行单独的视锥体检测。对于场景中子对象数量非常多的情况,可能会导致性能下降。 适用场景:在大规模场景或有很多分散对象时,开启这个选项可以提升性能;但如果子对象密集或变化不大,禁用该属性(设置为 false)可能会提高整体渲染效率。 - sortObjects : Boolean 如果为 true,则对 BatchedMesh 中的各个对象进行排序以改善与过度绘制相关的工件。如果材质被标记为“透明”,则对象将从后到前渲染,如果没有,则它们从前到后渲染。默认为 true。
sortObjects: Boolean 用于控制是否对场景中的对象进行排序,默认值为 true。对于有透明对象的场景,启用该属性有助于确保渲染顺序正确,而在没有透明对象或性能要求较高的场景中,可以选择禁用此属性以优化性能。 - maxInstanceCount : Integer 只读,BatchedMesh 中可以存储的单个几何体的最大数量。
- isBatchedMesh : Boolean 用于检查给定对象是否属于 BatchedMesh 类型的只读标志。
方法
- computeBoundingBox () : undefined 计算边界框,更新 .boundingBox 属性。 默认情况下不计算边界框。它们需要显式计算,否则就是 null。
- computeBoundingSphere () : undefined 计算边界球,更新 .boundingSphere 属性。 默认情况下不计算边界球。它们需要显式计算,否则就是 null。
- dispose () : undefined 释放该实例分配的GPU相关资源。每当您的应用程序中不再使用此实例时,请调用此方法。
- setCustomSort ( sortFunction : Function ) : this 对渲染之前运行的函数进行排序。该函数需要一个要排序的项目列表和一个相机。列表中的对象包含一个“z”字段,用于执行深度排序。
// 向 Group 中添加多个子对象(假设已添加)
batchedMesh.addGeometry(mesh1);
batchedMesh.addGeometry(mesh2);
batchedMesh.addGeometry(mesh3);
// 使用 setCustomSort 自定义排序逻辑
batchedMesh.setCustomSort((a, b) => {
return a.position.x - b.position.x; // 根据 position.x 进行排序
});
// 将 Group 添加到场景中
scene.add(group);
- getMatrixAt ( index : Integer, matrix : Matrix4 ) : Matrix4 index: 实例的索引。值必须在 [0, count] 范围内。 matrix: 这个 4x4 矩阵将被设置为定义实例的局部变换矩阵。 获取定义实例的局部变换矩阵。
- getVisibleAt ( index : Integer ) : Boolean index: 实例的索引。值必须在 [0, count] 范围内。 获取给定实例是否标记为“可见”。
- setMatrixAt ( index : Integer, matrix : Matrix4 ) : this index: 实例的索引。值必须在 [0, count] 范围内。 matrix: 表示单个实例的局部变换的 4x4 矩阵。 将给定的局部变换矩阵设置为定义的实例。
- setVisibleAt ( index : Integer, visible : Boolean ) : this index: 实例的索引。值必须在 [0, count] 范围内。 visible: 指示可见性状态的布尔值。 设置给定索引处对象的可见性。
- addGeometry ( geometry : BufferGeometry, reservedVertexRange : Integer, [param:Integer reservedIndexRange] ) : Integer geometry: 要添加到 BatchedMesh 中的几何体。 reservedVertexRange: 可选参数,指定为添加的几何体保留的顶点缓冲区空间量。如果计划稍后在此索引处设置大于原始几何图形的新几何图形,则这是必要的。默认为给定几何顶点缓冲区的长度。 reservedIndexRange: 可选参数,指定为添加的几何体保留的索引缓冲区空间量。如果计划稍后在此索引处设置大于原始几何图形的新几何图形,则这是必要的。默认为给定几何索引缓冲区的长度。 将给定几何体添加到 BatchedMesh 并返回引用它的关联索引。
- **geometry: BufferGeometry**:要添加的几何体。这是一个 `BufferGeometry` 对象,表示网格的形状和结构。
- **reservedVertexRange: Integer**:为添加的几何体保留的顶点范围。这个参数指定了该几何体在批处理网格中的顶点数量,确保在该范围内不会有其他几何体的顶点占用。这对于管理复杂的网格结构很有用,尤其是在需要精确控制每个几何体的顶点索引时。
- **reservedIndexRange: Integer**(可选):为添加的几何体保留的索引范围。如果不提供该参数,默认值为 `0`。该值表示在索引数组中保留的索引数量。这对于包含索引缓冲区的几何体尤为重要,能够帮助你更好地管理几何体之间的关系。
- setGeometryAt ( index : Integer, geometry : BufferGeometry ) : Integer index: 用该几何图形替换哪个几何图形索引。 geometry: 在给定几何索引处替换的几何。 用提供的几何图形替换 index 的几何图形。如果索引处没有为几何体保留足够的空间,则会引发错误。
- getInstanceCountAt ( index : Integer ) : Integer index:实例的索引。值必须在 [0, count] 范围内。 获取索引处几何体的实例计数。如果未配置实例计数,则返回 null。
- setInstanceCountAt ( index : Integer, instanceCount : Integer ) : Integer index:配置实例计数的几何索引。 instanceCount:给定几何索引的要渲染的实例数。 设置索引处几何体的实例计数。