在 Three.js 中,几何体(Geometry)和缓冲几何体(BufferGeometry)都是用于定义三维模型的对象。它们都包含了模型的顶点、法线、颜色、纹理等信息。但是,它们在数据组织方式和性能上有所不同。

Geometry 是 Three.js 中最早的几何体表示方式,它的数据存储方式是非缓冲的(non-buffered),即每个顶点的属性都会保存在一个单独的数组中,并且每个面的顶点索引也会保存在一个单独的数组中。这种数据存储方式的好处是易于理解和使用,但是在性能方面存在一些问题。由于数据的存储方式不是连续的,因此对于大规模的几何体,它需要更多的内存来存储数据,并且在渲染时需要更多的计算来将数据转换成连续的格式。

BufferGeometry 是 Three.js 中新增的几何体表示方式,它的数据存储方式是缓冲的(buffered),即所有顶点的属性都会存储在一个连续的数组中,并且每个面的顶点索引也会存储在一个连续的数组中。这种数据存储方式的好处是内存占用更少,渲染速度更快,因为数据是连续的,可以更快地被 GPU 访问。

以下是两种几何体的创建方法:

  1. Geometry

apacheCopy

var geometry = new THREE.Geometry();
geometry.vertices.push(new THREE.Vector3(-1, -1, 0));
geometry.vertices.push(new THREE.Vector3(0, 1, 0));
geometry.vertices.push(new THREE.Vector3(1, -1, 0));
geometry.faces.push(new THREE.Face3(0, 1, 2));
  1. BufferGeometry

apacheCopy

var geometry = new THREE.BufferGeometry();
var vertices = new Float32Array([-1, -1, 0, 0, 1, 0, 1, -1, 0]);
var indices = new Uint16Array([0, 1, 2]);
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));
geometry.setIndex(new THREE.BufferAttribute(indices, 1));

在这个示例中,我们分别创建了一个 Geometry 和一个 BufferGeometry,并向它们添加了顶点和面。对于 Geometry,我们使用了 THREE.Geometry 类,并使用 vertices 属性和 faces 属性分别添加了顶点和面。对于 BufferGeometry,我们使用了 THREE.BufferGeometry 类,并使用 Float32Array 和 Uint16Array 分别创建了顶点和面的索引数组,并通过 setAttribute 和 setIndex 方法将它们设置为几何体的属性。

需要注意的是,BufferGeometry 在使用时需要注意数据类型和数据长度的匹配,例如 Float32Array 表示 32 位浮点数数组,每个元素占用 4 个字节,因此如果顶点坐标有 3 个分量,那么它们的长度应该是 3 的倍数。

综上所述,虽然 Geometry 在使用时更加简单,但是在性能方面不如 BufferGeometry。因此,在实际项目中,建议优先使用 BufferGeometry。

By lxcss

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注