作为我的场景对象的基础,我有一个根 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) 时,我看到它穿过树,移除 Object3D,并清理网格。但是当我观察堆时,我看到虽然 Object3D 已被移除,但 2 个 Mesh 对象(及其关联的 BufferGoemetry 和 Material 对象)仍然存在。如果我在清除后第二次加载数据,我会看到 3 个 Object3D(好的)和 4 个网格(不好)。
我相信这意味着引用没有被正确清除,但我没有看到堆中的任何保留器会这样做。
我一定是错过了导致这些物体徘徊的其他东西。
r69dev(我在 r68 中看到了相同的内容),在 Chrome 36.0.1985.125 中进行测试