【问题标题】:Freeing memory with threejs使用threejs释放内存
【发布时间】:2017-02-15 17:29:45
【问题描述】:

当我使用 scene.remove(mesh) 删除网格时,我在threejs 中释放内存时遇到了一些问题,网格被删除但似乎从 js 使用的内存没有被释放。

我正在为网格和窗口使用带有 buffergeometry 的 webglrenderer。

【问题讨论】:

  • 你是否在某个闭包中引用了网格?
  • 是的,但在删除网格后,我将引用设置为 null :(

标签: javascript three.js


【解决方案1】:

我在处理我的项目时也遇到了同样的问题。我怀疑您只是从场景中删除了网格,而不是从内存中。尝试执行以下操作以释放内存。它对我有用。

if (mesh) {
    scene.remove(mesh);
    mesh.geometry.dispose();
    mesh.material.dispose();                                    
    mesh = [];
}

另外,请阅读此 StackOverflow 讨论以获得进一步说明。 freeing memory in three.js

【讨论】:

    【解决方案2】:

    这可能是 js 内存使用的阴暗面。

    首先尝试为您的对象设置原始值。

    mesh.geometry.dispose();
    mesh.geometry = null; // or undefined .
    
    // `delete` also cool but not support for old browsers 
    // The delete keyword deletes both the value of the property 
    // and the property itself.
    delete mesh.geometry 
    

    另一种方式(尝试一些技巧):

     mesh.geometry = VerySmallmesh.geometry  //see for three.js how to do this if this is not correct mesh.geometry = null; 
    // try to override memory stack 
    

    你必须确定这个对象只是他自己的实例(怎么说)。确保你没有克隆,如果你有的话,你也需要摧毁他。

    更新:我想说一句,使用 slice 方法从 forEach 或 for 循环中的对象中清除数组。

    【讨论】:

    • 嗯,好的,我会尝试调用 dispose 并查看是否有变化,但是如果我有一些 object3D 和一些孩子并且每个孩子都有另一个孩子,我需要为每个网格调用 dispose?并且有一种方法可以轻松地在每个孩子身上做到这一点?
    • 将本页读到最后(最重要的是在底部页):github.com/mrdoob/three.js/issues/5175,而不是查看此 threejs.org/examples/#webgl_test_memory 中的示例
    • 似乎可以,谢谢,但是释放内存需要时间,有没有快速释放内存的方法?我问这个是因为我需要在具有 1 GB 内存的智能手机中使用threejs
    • 在移动设备上,您需要进行较大的修改,我建议您优化项目的各个方面。让网格更低多边形,注意材质、纹理甚至 console.log 都会造成麻烦......你说得很好:'需要时间来释放内存'......
    • 是的......我已经知道了......谢谢你的时间:)我会在桌面应用程序上接受这个答案工作正常,对于移动设备没问题我认为我可以管理网格在反应组件生命周期中
    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    相关资源
    最近更新 更多