我希望避免创建新的类型化数组和相应的gc()。我用BufferedGeometry做了我的几何。接收到事件后,更新我的顶点和faces
索引。我可以通过设置verticesNeedUpdate
来更新坐标,但它不更新faces。更新被称为~20-50次每秒,这可能是沉重的浏览器。如何通过避免为JavaScript垃圾收集器创建大量垃圾来做到这一点?(请参阅下面的方法update()
)。
function WGeometry77(verts, faces) {
THREE.Geometry.call( this );
this.type = 'WGeometry77';
this.parameters = {};
// Initially create the mesh the easy way, by copying from a BufferGeometry
this.fromBufferGeometry( new MyBufferGeometry77( verts, faces ) );
};
WGeometry77.prototype = Object.create( THREE.Geometry.prototype );
WGeometry77.prototype.constructor = WGeometry77;
WGeometry77.prototype.update = function(verts, faces) {
var geom = this;
var nl = Math.min(geom.vertices.length, verts.length/3);
for ( var vi = 0; vi < nl; vi ++ ) {
geom.vertices[ vi ].x = verts[vi*3+0];
geom.vertices[ vi ].y = verts[vi*3+1];
geom.vertices[ vi ].z = verts[vi*3+2];
}
var nf = Math.min(geom.faces.length, faces.length/3);
for ( var fi = 0; fi < nf; fi ++ ) {
geom.faces[ fi ].a = faces[fi*3+0];
geom.faces[ fi ].b = faces[fi*3+1];
geom.faces[ fi ].c = faces[fi*3+2];
}
geom.verticesNeedUpdate = true; // Does not update the geom.faces
}
PS。我的代码是用Emscripten编写的,它可以这样做:
var verts = Module.HEAPF32.subarray(verts_address/_FLOAT_SIZE, verts_address/_FLOAT_SIZE + 3*nverts);
我想做的几乎是动画,或者一个动态几何(使用Marching多维数据集计算)。但是我的拓扑图(网格图)也被更新了。我应该使用哪个ThreeJS类?如果没有这样的类,我应该创建一个像UpdatableBufferedGeometry
这样的新类吗?
发布于 2016-06-21 14:28:53
若要在呈现后更新THREE.BufferGeometry
,可以使用以下模式:
geometry.attributes.position.setXYZ( index, x, y, z );
geometry.attributes.position.needsUpdate = true;
对于索引的BufferGeometry
,您可以更改index
数组如下:
geometry.index.array[ index ] = value;
geometry.index.needsUpdate = true;
您不能调整缓冲区的大小-只更改它们的内容。您可以预先分配较大的数组并使用
geometry.setDrawRange( 0, numVertices );
three.js r.78号
发布于 2016-06-20 19:31:06
如果您想提高效率,您应该创建一个BufferGeometry
而不是Geometry
。
您可以使用此示例的源代码作为参考:uint
https://stackoverflow.com/questions/37927031
复制相似问题