Javascript 动态创建和销毁Three.js场景而不泄漏内存
假设我们有一个有两个按钮的页面,创建和销毁。当您单击CreateTree.js时,下面的内存测试将动态添加到页面并开始运行。单击“销毁”应删除场景,取消分配所有缓冲区并释放所有内存等。 有人知道如何在不设置场景框架和更改url的情况下执行此操作吗Javascript 动态创建和销毁Three.js场景而不泄漏内存,javascript,memory,three.js,webgl,memory-leaks,Javascript,Memory,Three.js,Webgl,Memory Leaks,假设我们有一个有两个按钮的页面,创建和销毁。当您单击CreateTree.js时,下面的内存测试将动态添加到页面并开始运行。单击“销毁”应删除场景,取消分配所有缓冲区并释放所有内存等。 有人知道如何在不设置场景框架和更改url的情况下执行此操作吗 谢谢,JavaScript是一种垃圾收集语言。如果不再有对某个对象的任何引用(如旧场景),那么内存最终将被回收,除非在某个地方的实现中存在错误。不过,您链接的页面似乎工作正常。我本人长期以来一直为这个问题困扰,提出了chrome和Three.js的错
谢谢,JavaScript是一种垃圾收集语言。如果不再有对某个对象的任何引用(如旧场景),那么内存最终将被回收,除非在某个地方的实现中存在错误。不过,您链接的页面似乎工作正常。我本人长期以来一直为这个问题困扰,提出了chrome和Three.js的错误报告,但无法找到任何解决方案 由于某些原因,即使经过很长时间,内存也不会释放,似乎有东西一直指向内存块,因此垃圾收集器永远不会释放它 然而,这是我的诀窍
场景。移除(网格)
您可以使用取消分配内存
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开始就没有使用过。