缓冲区属性使用常量BufferAttributeUsage设置 BufferAttribute 的 使用模式(usage mode)
有三种提示可供用户指定数据。它们都基于用户将如何使用缓冲区。也就是说,用户是直接读取还是写入缓冲区的数据。
- DRAW:用户将把数据写入缓冲区,但不会读取数据。
- READ:用户不会写入数据,但用户将读回数据。
- COPY:用户将不会写入或读取数据。
有三个提示可以说明用户更改缓冲区数据的频率。
- STATIC:用户将设置一次数据。
- DYNAMIC:用户偶尔会设置数据。
- STREAM:用户每次使用后都会更改数据。或者几乎每次使用后都会更改数据。
THREE.StaticDrawUsage
THREE.DynamicDrawUsage
THREE.StreamDrawUsage
THREE.StaticReadUsage
THREE.DynamicReadUsage
THREE.StreamReadUsage
THREE.StaticCopyUsage
THREE.DynamicCopyUsage
THREE.StreamCopyUsage
在 Three.js 中,setUsage(THREE.DynamicDrawUsage)
是设置 BufferAttribute
的 使用模式(usage mode) 的方法。
背景
THREE.BufferAttribute
是用来存储几何体顶点数据(如位置、法线、颜色等)的一个类,它的 usage
属性告诉 WebGL 如何使用这些数据。这对优化 WebGL 的性能非常重要,特别是在数据频繁更新的情况下。
setUsage
方法的作用
setUsage
方法通过设置 usage
属性,告知 WebGL 数据的更新频率,帮助 WebGL 优化数据的传输方式。
Three.js 中定义了一些使用模式:
-
THREE.StaticDrawUsage
(默认值):表示数据只会被初始化一次,不会频繁更改。 -
THREE.DynamicDrawUsage
:表示数据会频繁更改,适合需要实时更新的场景。 -
THREE.StreamDrawUsage
:表示数据会频繁更改,但只会用一次。
通过调用 setUsage(THREE.DynamicDrawUsage)
,你显式地告诉 WebGL:
-
该属性的数据将会频繁更新。
-
WebGL 会为这种使用模式优化 GPU 的数据存储和处理方式,减少不必要的性能开销。
在代码中的意义
particles.setAttribute(
'position',
new THREE.BufferAttribute(particlePositions, 3).setUsage(THREE.DynamicDrawUsage)
);
-
particlePositions
是一个存储粒子位置的缓冲区数组。-
例如:
Float32Array
,包含粒子的三维坐标(x, y, z
)。
-
-
new THREE.BufferAttribute(particlePositions, 3)
创建一个BufferAttribute
,告诉 Three.js 每三个数字组成一个粒子的坐标。 -
.setUsage(THREE.DynamicDrawUsage)
告诉 WebGL:-
这些粒子的位置数据会被频繁修改(例如,在动画中不断更新粒子的位置)。
-
WebGL 会为这种场景调整内存存储和数据传输策略。
-
-
最后,通过
particles.setAttribute('position', ...)
将该缓冲属性应用到粒子的几何体中。
常见的使用场景
-
粒子系统:
-
粒子的位置会随着时间不断变化,需要频繁更新缓冲区。
-
-
动态几何体:
-
例如,实时更新顶点数据来实现形状的变化。
-
-
动画效果:
-
如顶点形变、波浪效果或其他基于顶点的数据更新。
-
性能优化的原因
如果不设置 DynamicDrawUsage
,默认使用 StaticDrawUsage
,WebGL 会假设数据几乎不变,从而对数据进行固定优化。对于频繁更新的数据,这会导致额外的性能开销,因为 WebGL 需要在每次更新时重新分配资源。
通过显式设置 DynamicDrawUsage
:
-
GPU 可以更高效地处理动态数据。
-
避免了不必要的资源分配或数据传输。