シーン オブジェクトの基礎として、単一のルート Object3D があります。私のデータは、このルートから Object3Ds のツリー構造としてロードされます。メッシュは、BufferGeometry/MeshPhongMaterial を使用してリーフ Object3D に追加されます。ルート Object3D をこのメソッドに渡すことで、既存のツリーをクリアします。
clearScene:
function (obj) {
if (obj instanceof THREE.Mesh)
{
obj.geometry.dispose();
obj.geometry = undefined;
obj.material.dispose();
obj.material = undefined;
obj = undefined;
}
else
{
if (obj.children !== undefined) {
while (obj.children.length > 0) {
this.clearScene(obj.children[0]); // removing children changes the length of the array.
obj.remove(obj.children[0]);
}
}
}
}
次の単純なツリーを考えてみましょう。
- シーン (シーン)
- ルート (Object3D)
- ブランチ (Object3D)
- リーフ(メッシュ)
- ブランチ (Object3D)
- ルート (Object3D)
この構造がシーンに入ったら、(Chrome の開発ツールを使用して) ヒープを観察します。3 つの Object3Ds オブジェクトと 2 つの Mesh オブジェクトが表示されます (エクストラはプロトタイプです)。
clearScene(Root) を呼び出すと、オブジェクト 3D が削除され、メッシュがクリーンアップされて、ツリーがステップ実行されます。しかし、ヒープを観察すると、Object3D は削除されていますが、2 つの Mesh オブジェクト (および関連する BufferGoemetry オブジェクトと Material オブジェクト) は残っていることがわかります。クリア後にもう一度データをロードすると、3 つの Object3D (問題なし) と 4 つのメッシュ (問題あり) が表示されます。
これは、参照が正しくクリアされていないことを意味すると思いますが、これを行うヒープ内のリテーナーは見当たりませんでした。
これらのオブジェクトをぶらぶらさせている他の何かが欠けているに違いありません。
r69dev (私は r68 でも同じことを見ていました)、Chrome 36.0.1985.125 でテストしています