【问题标题】:cleanup ThreeJS Scene - leak?清理 ThreeJS 场景 - 泄漏?
【发布时间】:2014-04-29 05:34:27
【问题描述】:

-Three.js 版本 66

-在 Chrome v33 中运行(最新)

-WebGL 渲染器

我有一个场景,我在其中绘制对象(节点)。这些对象都是我添加到场景中的“根”对象的所有子对象。用户可以按下按钮并切换要添加/删除的节点子集(无需更改/破坏相机)。

每次切换后,动画(相机移动)变得越来越慢,这向我表明存在泄漏。我已经查看了对象内部的任何地方和一些 WebGL 缓冲区,但我找不到泄漏。

在处理场景时我可能会遗漏一些东西吗?

我执行以下操作:

  1. 创建 WebGL 渲染器和场景对象
  2. 创建相机和照明并将它们添加到场景中
  3. 创建一个“根”object3d,将其添加到场景中
  4. 为每个节点创建一个 BoxGeometry、mesh、object3d 并将其添加到根对象

当用户按下按钮时:

  1. 从场景中移除所有 root 子节点
  2. 对于节点子集,创建 BoxGeometry、mesh、object3d 并将其添加到根对象

当用户再次按下按钮时:

  1. 从场景中移除所有 root 子节点
  2. 为每个节点创建 BoxGeometry、mesh、object3d 并将其添加到根对象

感谢任何帮助!!!


编辑

我实际上刚刚发现了问题。我的重绘方法再次调用了我的动画钩子,因此每种类型都添加了另一个额外的无意义动画。

如果其他人遇到此问题,请确保您只调用一次 ANIMATE 方法

为了帮助任何寻找通用清理的人,这就是我正在做的事情:

    function doDispose(obj)
    {
        if (obj !== null)
        {
            for (var i = 0; i < obj.children.length; i++)
            {
                doDispose(obj.children[i]);
            }
            if (obj.geometry)
            {
                obj.geometry.dispose();
                obj.geometry = undefined;
            }
            if (obj.material)
            {
                if (obj.material.materials)
                {
                    for (i = 0; i < obj.material.materials.length; i++)
                    {
                        obj.material.materials[i].dispose();
                    }
                }
                else
                {
                    obj.material.dispose();
                }
                obj.material = undefined;
            }
            if (obj.texture)
            {
                obj.texture.dispose();
                obj.texture = undefined;
            }
        }
        obj = undefined;
    }

【问题讨论】:

  • 你还需要去掉obj.material.dispose();周围的else条件。
  • 我遇到了同样的问题并且正在做同样的事情!非常感谢。
  • 我在搜索在处理几何/对象时是否清理动画时发现了这篇文章。希望其他人知道动画没有被删除会有所帮助,因此它可能有助于您的 dispose 函数包含清理代码。 function deleteAnimations(obj){ var globAnims = THREE.AnimationHandler.animations; var id = obj.id; for (var i=0, l=globAnims.length; i&lt;l; i++){ if (globAnims[i].root.id === id){ globAnims[i].stop(); } } }
  • 我可以告诉你防止动画函数多次运行吗?我已经为这个问题苦苦挣扎了很长时间。非常感谢!
  • @Richard 你知道如何在新版本 r94 中清理动画

标签: three.js webgl


【解决方案1】:

这对我来说非常有用,谢谢!

我为 Three.js 版本 72 修改了它

function doDispose(obj)
{
    if (obj !== null)
    {
        for (var i = 0; i < obj.children.length; i++)
        {
            doDispose(obj.children[i]);
        }
        if (obj.geometry)
        {
            obj.geometry.dispose();
            obj.geometry = undefined;
        }
        if (obj.material)
        {
            if (obj.material.map)
            {
                obj.material.map.dispose();
                obj.material.map = undefined;
            }
            obj.material.dispose();
            obj.material = undefined;
        }
    }
    obj = undefined;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 2017-10-21
    • 2016-05-31
    • 2019-06-20
    • 1970-01-01
    • 2012-04-16
    • 2013-12-06
    • 2014-02-22
    相关资源
    最近更新 更多