13

我有一个包含很多 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,但仍然没有减少内存。

知道我在做什么错吗?

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

4

2 回答 2

10

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

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

三.js r.60

于 2012-12-17T13:48:11.777 回答
-1

我确实尝试了所有的 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-08-03T10:31:18.327 回答