Three.js渲染3D柱状图时旋转卡顿怎么办?
最近在用Three.js做3D柱状图,当数据量超过500个柱子后,鼠标旋转视角时特别卡顿。我尝试过把材质改成BasicMaterial,合并所有柱子的几何体,但帧率还是掉到20多,控制台还偶尔报GL_OUT_OF_MEMORY的警告。这是不是模型优化没做好?
const geometry = new THREE.BufferGeometry();
const positions = [];
for(let i=0; i<500; i++) {
// 生成柱子顶点坐标
positions.push(i, Math.random()*10, 0);
}
geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
const mesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial());
scene.add(mesh);
这样合并网格后内存占用反而更高了,是不是应该用WebGL的Instancing方式?或者数据量太大必须用其他库?
下面这个写法能跑60帧以上:
这样 GPU 只画一次模型,复制500次实例,内存占用小很多,也不会触发 GL_OUT_OF_MEMORY。你之前报内存警告是因为每个柱子都没复用,就算合并也还是生成了超大顶点缓冲。
如果还要再优化,可以把数据更新逻辑节流,或者用 web worker 预计算矩阵。不过先用 InstancedMesh 跑起来再说,这一步改完帧率基本就能稳住。
记得在着色器里处理实例属性,这样能大幅提升性能。