Javascript 如何在ThreeJS中高效地更新几何体的拓扑?

Javascript 如何在ThreeJS中高效地更新几何体的拓扑?,javascript,three.js,typed-arrays,Javascript,Three.js,Typed Arrays,我希望避免创建新的类型化数组和随后的gc()。 我使用BufferedGeometry制作了几何图形。收到事件后,将更新我的顶点和面索引。我可以通过设置verticesNeedUpdate来更新坐标,但它不会更新面。每秒更新约20-50次,这可能会对浏览器造成很大影响。如何避免为JavaScript垃圾收集器创建大量垃圾来实现这一点?(请参阅下面的方法update()) 我想做的几乎是动画,或者是动态几何体(使用行进立方体计算)。但是我的拓扑(网格图)也被更新了。我应该使用哪个ThreeJS类?

我希望避免创建新的类型化数组和随后的gc()。 我使用BufferedGeometry制作了几何图形。收到事件后,将更新我的顶点和
索引。我可以通过设置
verticesNeedUpdate
来更新坐标,但它不会更新面。每秒更新约20-50次,这可能会对浏览器造成很大影响。如何避免为JavaScript垃圾收集器创建大量垃圾来实现这一点?(请参阅下面的方法
update()


我想做的几乎是动画,或者是动态几何体(使用行进立方体计算)。但是我的拓扑(网格图)也被更新了。我应该使用哪个ThreeJS类?如果不存在这样的类,我是否应该创建一个新类,如
UpdateableBufferedGeometry

如果需要效率,应该创建
BufferGeometry
而不是
Geometry

您可以使用此示例的源代码作为参考:

要在渲染后更新
THREE.BufferGeometry
,可以使用以下模式:

geometry.attributes.position.setXYZ( index, x, y, z );

geometry.attributes.position.needsUpdate = true;
对于索引的
BufferGeometry
,可以按如下方式更改
索引的数组:

geometry.index.array[ index ] = value;

geometry.index.needsUpdate = true;
不能调整缓冲区的大小,只能更改其内容。您可以预先分配较大的阵列并使用

geometry.setDrawRange( 0, numVertices );

three.js r.78

直接更新
缓冲几何体
。不要为此而实例化
几何体
。谢谢。你能在@MrDoob的回答下面看到我的评论吗?我有一个问题。当我直接更新它时(见下文),更改不会反映在屏幕上。只有当我用它做几何体的时候。添加网格时,如果执行以下操作,则在下一个渲染器中我看不到网格中的任何视觉变化。render()。我这样做:
重用了_geometry.attributes.position[4]+=20
重用的_geometry.index.array[2]=9即使移除网格并从同一几何体对象实例创建另一个网格,它也不会在屏幕上更新。我的目的是避免在动画循环中实例化缓冲区几何体@WestLangleyI从BufferGeometry派生了一个名为MyBufferGeometry77的类(参见主代码)。也许我做错了,例如,我应该实现一个虚拟方法?如果我“如果使用索引缓冲区几何体,则无法更改索引数组”,那么解决方案是什么?(@mrdoob)。为此目的在ThreeJS中创建一个新类?我可以做一个拉请求。对不起。正确答案。完美!我确实需要使用
setDrawRange()
,以便使用不同数量的三角形重用同一对象。在我的测试中,似乎甚至不需要设置
needsUpdate
(两者)。r77I有一个问题:在部分更新之后,如您的示例所示,是将整个缓冲区上载到GPU,还是仅将更新范围上载到GPU?全部,但您可以通过设置
attribute.setDynamic(true)
和设置
attribute.updateRange
进行部分更新。例如,请参见。
geometry.index.array[ index ] = value;

geometry.index.needsUpdate = true;
geometry.setDrawRange( 0, numVertices );