【问题标题】:Dynamically create and destroy a Three.js scene without leaking memory动态创建和销毁 Three.js 场景而不泄漏内存
【发布时间】:2013-01-24 17:14:10
【问题描述】:

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

有谁知道如何在不设置场景和更改网址的情况下做到这一点?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢 Claudiu,但即使我删除了所有引用,内存也没有被释放。我不确定 WebGL 是否有不同的规则、实现中的错误或其他什么。我看到一些错误报告提到了这一点,但没有太具体
      • 你能放一个测试页让我看看吗?
      • 虽然 3d 模型已从场景中卸载,但它们仍然存在于内存中,除非垃圾收集器将其删除。在几个浏览器中调用 GC 的当前可用命令参见下面的 stackoverflow 线程:stackoverflow.com/questions/10227422/… 在 Opera 和 Edge 中易于使用的 js GC 命令。对于 Chrome,您必须先解锁该命令。对于 Firefox,我没有找到任何直接的 js 命令(键入“about:memory”->“最小化内存使用”)。
      【解决方案3】:

      我自己也被这个问题困扰了很久,提出了 chrome 和 Three.js 的错误报告,但找不到任何解决方案。

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

      但是这对我来说是什么技巧

      1. 创建一个数组来保存添加到场景中的所有项目。
      2. 每当您向场景中添加额外的项目时,请将其添加到此数组中。
      3. 在销毁功能上,运行 scene.remove('item name') 将它们从场景中移除。
      4. 现在遍历数组并手动将所有项目设为未定义。

      通过这种方式,我能够从 Three.js 场景中申请超过 600MB 的 RAM。

      更新

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

      在 webGLRenderer 中,使用移除网格后

      scene.remove( mesh ),

      你可以释放内存

      renderer.deallocateObject( mesh );

      你可以用

      释放纹理

      renderer.deallocateTexture( texture );

      【讨论】:

      • 这在 r69 中有效吗?我认为 rendere no londeg 有这些方法吗?
      • 不确定当前的更新,自 r62 以来没有处理过。
      猜你喜欢
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2011-04-17
      相关资源
      最近更新 更多