【问题标题】:Three js memory management三 js内存管理
【发布时间】:2012-12-04 14:18:19
【问题描述】:

我有一个包含大量 Mesh 和 MorphAnimMesh 的大型场景。我想在删除网格时释放内存。如果我知道正确,这是最好的方法:

for ( var i = scene.children.length - 1; i >= 0 ; i -- ) {
  var obj = scene.children[i];
  scene.remove(obj);
  obj.deallocate(); 
  obj.geometry.deallocate();
  obj.material.deallocate();
  obj.material.map.deallocate();
}

如果我在此之后在任务管理器中检查内存使用情况,则没有任何变化。 (试图为 GC 等待几分钟,但什么也没有。) Google Chrome 内存快照显示对象仍然存在。 THREE.Geometry @1862203 等中的 morphTargets。

尝试将obj设置为null,但仍然没有减少内存。

知道我做错了什么吗?

这是一个有关卡的游戏,玩家可以从一个到另一个。经过几次更改后,内存使用量增加到非常高。这就是为什么我想在级别更改之前从内存中删除所有对象。

【问题讨论】:

    标签: javascript memory-management three.js


    【解决方案1】:

    您很可能需要添加以下部分或全部内容:

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

    看看这些例子:

    http://mrdoob.github.com/three.js/examples/webgl_test_memory.html

    http://mrdoob.github.com/three.js/examples/webgl_test_memory2.html

    three.js r.60

    【讨论】:

    • 试过了,但没有任何改变。如果我在 chrome 中拍摄堆快照,对象、数组(例如:THREE.Geometry @1862203 中的 morphTargets)仍然存在并且内存使用情况相同。
    • 也许您在某处持有对网格、纹理或材质的引用?
    • 这些例子的问题是它们不涉及纹理
    【解决方案2】:

    我确实尝试了所有的 dispose 和 deallocate 方法,但没有任何效果。

    然后我为使用 webgl 渲染器渲染 360 度图像的 ionic 应用程序执行了以下操作。

    this.renderer = new THREE.WebGLRenderer({ antialias: true });
    RicohView.prototype.stopRendering = function () {
        this.canRender = false;
        this.renderer.forceContextLoss();
        this.renderer.dispose();
        console.log('renderer disposed');
        cancelAnimationFrame(this.requestId);
    }
    

    requestId 是可以从

    捕获的东西
    this.requestId = requestAnimationFrame(render);
    

    【讨论】:

      猜你喜欢
      • 2017-11-09
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 2013-03-19
      • 2019-08-27
      • 1970-01-01
      相关资源
      最近更新 更多