three.js - 清理 ThreeJS 场景 - 泄漏?

标签 three.js webgl

-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 并将其添加到根对象

感谢任何帮助!!!

<小时/>

编辑

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

如果其他人遇到此问题,请确保仅调用一次动画方法

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

    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;
    }

最佳答案

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

我将其修改为 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;
}

关于three.js - 清理 ThreeJS 场景 - 泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22565737/

相关文章:

javascript - Three.js 对象居中

javascript - Three.js聚光灯阴影不显示

javascript - Sprite 不能从 three.js 场景中删除?

javascript - requestAnimationFrame计算耗时

javascript - 无法打开所选对象的指向 url

opengl-es - 在 UV 坐标中查找屏幕像素的大小以供片段着色器使用

javascript - three.js 上的延迟着色。使用 gl_fragData

javascript - Three.js 更新相机矩阵世界

javascript - 在 Chrome 18 中检测 SwiftShader WebGL 渲染器

javascript - 将场景中新的 ThreeJS 子元素置于前端和中心?