清理ThreeJS场景 - 泄漏?

时间:2014-03-21 17:36:26

标签: three.js webgl

-Three.js第66版

- 在Chrome v33中运行(最新)

-WebGL渲染器

我有一个绘制对象(节点)的场景。这些对象都是" root"的所有子对象。我添加到场景中的对象。用户可以按下按钮并切换要添加/删除的节点子集(不更改/销毁相机)。

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

有什么东西我可以丢失处理场景吗?

我执行以下操作:

  1. 创建WebGL渲染器和场景对象
  2. 创建相机和灯光并将其添加到场景
  3. 创建一个' root' object3d,将其添加到场景中
  4. 对于每个节点,创建一个BoxGeometry,mesh,object3d并将其添加到根对象
  5. 当用户按下按钮时:

    1. 从场景中删除root的所有子项
    2. 对于节点子集,创建BoxGeometry,mesh,object3d并将其添加到根对象
    3. 当用户再次按下按钮时:

      1. 从场景中删除root的所有子项
      2. 对于每个节点,创建BoxGeometry,mesh,object3d并将其添加到根对象
      3. 感谢任何帮助!!!


        修改

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

        如果有其他人有这个问题请确认你只需要你的动画方法

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

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

1 个答案:

答案 0 :(得分:3)

这对我来说非常出色,谢谢!

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