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

时间:2013-01-24 17:14:10

标签: javascript memory three.js webgl memory-leaks

让我们说我们有一个带有两个按钮的页面,创建和销毁。当您单击创建此内存测试中的Three.js场景时,下面的动态添加到页面并开始运行。单击destroy应删除场景,处理所有缓冲区并释放所有内存等。 http://mrdoob.github.com/three.js/examples/webgl_test_memory.html

有没有人知道如何在不构建场景和更改网址的情况下执行此操作?

感谢

3 个答案:

答案 0 :(得分:2)

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

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

https://github.com/mrdoob/three.js/blob/master/examples/webgl_test_memory.html

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我自己对这个问题感到困扰,因为Chrome和Three.js长期提出错误报告,但无法找到任何解决方案。

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

然而,这就是我的诀窍

  1. 创建一个数组,用于保存添加到场景中的所有项目。
  2. 每当您向场景添加额外项目时,请将其添加到此阵列。
  3. 在销毁功能上,运行scene.remove('item name')将其从场景中删除。
  4. 现在遍历数组并手动使所有项目都未定义。
  5. 通过这种方式,我能够从Three.js场景中获得超过600MB的RAM。

    更新

    Doob先生和WestLangley先生的回答Memory leak with three.js and many shapes,我还没有用我的代码测试这个。

    在webGLRenderer中,用

    删除网格后

    scene.remove( mesh )

    你可以用

    解除内存

    renderer.deallocateObject( mesh );

    您可以使用

    取消分配纹理

    renderer.deallocateTexture( texture );