10

THREE.SceneThree.js には、そのシーン内のすべてのオブジェクトを破棄する適切な方法がないようです。

現在、私は次のことを行っています:

  $.each(scene.__objects, function(idx, obj) {                               
    scene.remove(obj);                                                                                     
    if (obj.geometry) {                                                                                    
      obj.geometry.dispose();                                                                              
    }                                                                                                      
    if (obj.material) {                                                                                    
      if (obj.material instanceof THREE.MeshFaceMaterial) {                 
        $.each(obj.material.materials, function(idx, obj) {                 
          obj.dispose();                                                                                   
        });                                                                                                
      } else {                                                                                             
        obj.material.dispose();                                                                            
      }                                                                                                    
    }                                                                                                      
    if (obj.dispose) {                                                                                     
      obj.dispose();                                                                                       
    }                                                                                                      
  });             

Chrome ヒープ プロファイラーを見ると、クリーンアップされていないオブジェクトがまだたくさんあります (テクスチャ、シェーダー マテリアル、ベクターなど...)。

4

1 に答える 1

4

three.js でメモリを処分するためのよりクリーンで汎用的な方法が必要であるという arriu の意見に同意します。おそらくシーン ノードから開始して、ずっと下に移動します。また、より多くの種類のメモリ割り当てを処理するために、上記の彼の汎用関数を拡張する必要があると思います。

  • 例を見ると、例webgl_test_memory.htmlに非常に固有のことを行い、割り当ての直後にメモリを解放します。
  • この例を見るwebgl_test_memory2.htmlと、配列にメッシュを追加し、配列の要素を調べて破棄するという、非常に具体的なことも行われています。このメソッドは、関数呼び出し内で行われた多くのメモリ割り当てを処理できません。

2 つの例でメモリが解放されないと言っているのではありません。シーン ノードには、その下のすべてのメモリを解放するメソッドが必要だと思います。

于 2013-01-26T11:56:11.677 に答える