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

three.js r.60

于 2012-12-17T13:48:11.777 に答える
-1

すべての dispose メソッドと deallocate メソッドを試しましたが、何も機能しませんでした。

次に、webgl レンダラーを使用して 360 画像をレンダリングするイオン アプリケーションに対して次のことを行いました。

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 に答える