javascript - 从场景中移除所有物体的正确方法

标签 javascript three.js

我知道有很多这样的问题询问类似的事情,从场景中删除所有内容,但是我尝试过的所有内容都没有按照我希望的方式工作。似乎也没有一种明确的方法可以从场景中删除所有内容(在文档或类似的内容中),因此我希望有人可以告诉我正确的方法。

下面是我当前用来从场景中删除所有内容的函数:

function removeAll() {
    while (scene.children.length > 0) {
        scene.remove(scene.children[0]);
        if (scene.children[0] == THREE.Mesh || scene.children[0] == THREE.Object3D || scene.children[0] == THREE.Group) {
            scene.children[0].dispose();
            scene.children[0].geometry.dispose();
            scene.children[0].material.dispose();
        }
    }
}

很好,并且似乎从视觉上删除了场景中的所有内容。

我的问题是,如果我调用这个函数,然后重新调用创建场景的函数,或者创建新场景的函数(请参阅上下文部分,我有多个),那么场景中的对象比第一次调用场景创建函数 (init()) 后的对象要多 - 使用控制台中的 renderer.info 检查。

我还注意到,在调用 removeAll() 函数然后重新加载场景后,我执行的次数越多,场景就越迟钝,我认为这是因为并非所有内容都被正确删除。

所以我问:

从场景中删除所有内容的正确方法是什么。

上下文:

我有一个 HTML 菜单,用户可以在其中选择他们想要“跳”到的场景。当他们执行此操作时,我需要删除所有内容,然后仅重新加载该特定场景的对象。我可以使用所有这些功能,唯一的问题是在新场景加载之前删除对象。

最佳答案

我看到的最重要的一点是,您只处理了顶级场景子项。如果这些对象本身有子对象,那么它们不一定会被正确处理。

老实说,确保清理所有内容的最佳方法就是处理渲染器并创建一个新渲染器并转储场景并让它被 GC 处理。

如果您想坚持尝试使用一种方法来清除所有内容,那么您需要递归到子级并处理它们可能具有的任何几何图形、 Material 和纹理。

您可以在this中找到非常全面的dispose函数。相关帖子。我要对其进行的唯一更改是修改 diposeHierarchy 以将对象彼此分离,如下所示:

function disposeHierarchy (node, callback)
{
    for (var i = node.children.length - 1; i >= 0; i--)
    {
        var child = node.children[i];
        disposeHierarchy (child, callback);
        callback (child);
        node.remove(child);
    }
}

关于javascript - 从场景中移除所有物体的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50395715/

相关文章:

javascript - 定位 raphael 纸对象

javascript - 有没有比将分块输入附加到字符串并随后在其上运行 `JSON.parse()` 更好的方法来接受 JSON 数据?

javascript - 加载 html5 Canvas 中的所有颜色非常缓慢

php - 无论如何要保护对 PHP 的 JavaScript 请求 - (不可能)?

javascript - Three.js 不上传加载本地FBX文件

javascript - Three.js 带顶点的 RGB 立方体

javascript - 执行Jquery function()的两个条件

three.js - 围绕其中心点旋转自定义几何网格

javascript - Three.js - 打开 PerspectiveCamera 显示边界球体

javascript - 使用动画缩放立方体 Y webgl Three.js