5

create と destroy の 2 つのボタンがあるページがあるとします。[Create the Three.js scene in this memory test] をクリックすると、以下のメモリ テストがページに動的に追加され、実行が開始されます。破棄をクリックすると、シーンが削除され、すべてのバッファが解放され、すべてのメモリが解放されます。 http://mrdoob.github.com/three.js/examples/webgl_test_memory.html

シーンをフレーミングしてURLを変更せずにこれを行う方法を知っている人はいますか?

ありがとう

4

3 に答える 3

2

サイド ジオメトリ、マテリアル、テクスチャで dispose() メソッドを使用する必要があると思います。

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

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

于 2016-04-07T19:39:44.907 に答える
1

私自身、この質問に長い間悩まされ、chrome と Three.js でバグ レポートを上げましたが、解決策を見つけることができませんでした。

何らかの理由で、長時間経ってもメモリが解放されず、何かがメモリ ブロックを指し続けているように見えるため、ガベージ コレクタがメモリを解放しません。

しかし、これが私にとってトリックをしたものです

  1. シーンに追加されたすべてのアイテムを保持する配列を作成します。
  2. シーンにアイテムを追加するときはいつでも、この配列に追加してください。
  3. destroy 関数で、scene.remove('item name') を実行してシーンから削除します。
  4. 配列を繰り返し処理し、すべての項目を手動で未定義にします。

このようにして、Three.js シーンから 600MB 以上の RAM を要求することができました。

アップデート

Doob 氏と WestLangley 氏による回答three.js と多くの shape でメモリ リークが発生しました。コードでこれをまだテストしていません。

webGLRenderer でメッシュを削除した後、

scene.remove( mesh )

でメモリの割り当てを解除できます

renderer.deallocateObject( mesh );

でテクスチャの割り当てを解除できます

renderer.deallocateTexture( texture );

于 2014-02-12T10:44:23.710 に答える
1

JavaScript はガベージ コレクション言語です。特定のオブジェクト (古いシーンなど) への参照がなくなった場合、実装のどこかにバグがない限り、メモリは最終的に回収されます。ただし、リンク先のページは正常に機能しているようです。

于 2013-01-24T17:18:28.097 に答える