小编use*_*063的帖子

清理ThreeJS场景 - 泄漏?

-Three.js版本66

- 在Chrome v33中运行(最新)

-WebGL渲染器

我有一个场景,我在其中绘制对象(节点).对象都是我添加到场景中的"根"对象的子对象.用户能够按下按钮并切换要添加/删除的节点子集(不更改/销毁相机).

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

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

我做以下事情:

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

当用户按下按钮时:

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

当用户再次按下按钮时:

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

感谢任何帮助!


编辑

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

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

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

    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) …
Run Code Online (Sandbox Code Playgroud)

webgl three.js

5
推荐指数
1
解决办法
2586
查看次数

标签 统计

three.js ×1

webgl ×1