Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 动态创建和销毁Three.js场景而不泄漏内存_Javascript_Memory_Three.js_Webgl_Memory Leaks - Fatal编程技术网

Javascript 动态创建和销毁Three.js场景而不泄漏内存

Javascript 动态创建和销毁Three.js场景而不泄漏内存,javascript,memory,three.js,webgl,memory-leaks,Javascript,Memory,Three.js,Webgl,Memory Leaks,假设我们有一个有两个按钮的页面,创建和销毁。当您单击CreateTree.js时,下面的内存测试将动态添加到页面并开始运行。单击“销毁”应删除场景,取消分配所有缓冲区并释放所有内存等。 有人知道如何在不设置场景框架和更改url的情况下执行此操作吗 谢谢,JavaScript是一种垃圾收集语言。如果不再有对某个对象的任何引用(如旧场景),那么内存最终将被回收,除非在某个地方的实现中存在错误。不过,您链接的页面似乎工作正常。我本人长期以来一直为这个问题困扰,提出了chrome和Three.js的错

假设我们有一个有两个按钮的页面,创建和销毁。当您单击CreateTree.js时,下面的内存测试将动态添加到页面并开始运行。单击“销毁”应删除场景,取消分配所有缓冲区并释放所有内存等。

有人知道如何在不设置场景框架和更改url的情况下执行此操作吗


谢谢,JavaScript是一种垃圾收集语言。如果不再有对某个对象的任何引用(如旧场景),那么内存最终将被回收,除非在某个地方的实现中存在错误。不过,您链接的页面似乎工作正常。

我本人长期以来一直为这个问题困扰,提出了chrome和Three.js的错误报告,但无法找到任何解决方案

由于某些原因,即使经过很长时间,内存也不会释放,似乎有东西一直指向内存块,因此垃圾收集器永远不会释放它

然而,这是我的诀窍

  • 创建一个数组,该数组将保存添加到场景中的所有项目
  • 无论何时向场景中添加额外的项目,都要将其添加到此数组中
  • 在销毁函数中,运行scene.remove('item name')将其从场景中删除
  • 现在遍历数组并手动使所有项都未定义
  • 通过这种方式,我能够从Three.js场景中获得超过600MB的RAM

    更新

    Doob先生和WestLangley先生的回答:我还没有用我的代码测试这个

    在webGLRenderer中,使用

    场景。移除(网格)

    您可以使用取消分配内存

    renderer.deallocateObject(网格)

    您可以使用取消分配纹理


    renderer.deallocateTexture(纹理)

    我认为您需要在侧面几何体、材质和纹理中使用dispose()方法

    geometry.dispose();
    material.dispose();
    texture.dispose();
    

    谢谢Claudiu,但是即使我删除了所有引用,内存也不会被释放。我不确定WebGL是否有不同的规则,在实现中是否有bug或者其他什么。我已经看到一些bug报告提到了这一点,但是没有太具体的内容。你能提供一个测试页面让我看一下吗?尽管3d模型是从场景中卸载的,但它们仍然存在于内存中,除非垃圾收集器将其移除。请参阅下面的stackoverflow线程,以了解当前可用于在多个浏览器中调用GC的命令:在Opera和Edge中,js GC命令易于使用。对于Chrome,必须先解锁命令。对于Firefox,我没有找到任何直接的js命令(键入“about:memory”->“最小化内存使用”)。这在r69中有效吗?我认为rendere没有这些方法?不确定当前的更新,从r62开始就没有使用过。