8

BufferGeometry を使用して地形を構成する何千もの立方体を描画していますが、立方体の 1 つの位置を変更する必要がある場合にジオメトリを更新する方法を見つけるのに苦労しています。たとえば、ジオメトリを初期化するためのこのコードがあります: (この例の更新バージョンでテストを行っています)

// 12 triangles per cube (6 quads)
var triangles = 12 * 150000;

var geometry = new THREE.BufferGeometry();
geometry.attributes = {

    position: {
        itemSize: 3,
        array: new Float32Array( triangles * 3 * 3 ),
        numItems: triangles * 3 * 3
    },

    normal: {
        itemSize: 3,
        array: new Float32Array( triangles * 3 * 3 ),
        numItems: triangles * 3 * 3
    },

    color: {
        itemSize: 3,
        array: new Float32Array( triangles * 3 * 3 ),
        numItems: triangles * 3 * 3
    }
}

positions = geometry.attributes.position.array;
normals = geometry.attributes.normal.array;
colors = geometry.attributes.color.array;

立方体を移動しても、移動するまで移動しているようには見えません。

geometry.attributes.position.needsUpdate = true;

これにより、更新中に FPS が低下します。これを行う別の方法はありますか?1 つの立方体 (12 の三角形/36 の頂点) のみを変更する場合は、少し不必要に思えます。そうかもしれませんが、needsUpdate実際に何ができるかは確認していません。推測すると、配列が再びシェーダーに送信されます。

ジオメトリを個別の小さな BufferGeometries に分割できると考えていましたが、それが全体的なパフォーマンスに役立つかどうかはわかりません。私が理解していることから、より多くのジオメトリ = 少ない FPS です。

誰かが私がこれを行う方法を知っているなら、それは大歓迎です! :)更新の問題に加えて、BufferGeometryはまさに私が必要としているもののようです。ありがとう!

4

2 に答える 2

8

BufferGeometryその中のいくつかの頂点を更新するときに、非常に大きなもので同じ問題が発生しました。

解決策は、バッファの一部だけを更新する_gl.bufferSubData代わりにを使用することです。_gl.bufferData(three.js は のみを使用します_gl.bufferData)。

したがって、位置を更新すると、次のようになります。

// Create a view of the data to update from index offsetSub to offsetSubEnd
var view = geometry.attributes.position.array.subarray(offsetSub, offsetSubEnd);

// Bind the buffer for positions (get the gl context with webglrenderer)
_gl.bindBuffer(_gl.ARRAY_BUFFER, geometry.attributes.position.buffer);

// Insert the new values at good index in gpu buffer (offsetGeometry is in byte)
_gl.bufferSubData(_gl.ARRAY_BUFFER, offsetGeometry,view);

に比べてバッファ頂点の大部分を変更すると、このソリューションは遅くなる可能性があることに注意してください_gl.bufferData

于 2013-12-06T11:07:13.110 に答える