如何正确处理Three.js场景? (R55)

时间:2013-01-25 21:06:35

标签: javascript memory-leaks three.js

似乎Three.js没有很好的方法来处置THREE.Scene以及该场景中的所有对象。

目前我正在做以下事情:

  $.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堆分析器,仍有许多对象无法清理(纹理,着色材质,矢量等)。

1 个答案:

答案 0 :(得分:4)

我同意到,应该有一种更清晰,更通用的方法来处理three.js中的内存,可能从场景节点开始并一直向下遍历。我还认为应该扩展上面的泛型函数,以便处理更多类型的内存分配。查看示例webgl_test_memory.html,它会对示例执行一些非常具体的操作,并在分配后立即释放内存。查看webgl_test_memory2.html此示例还通过向数组添加网格然后遍历并处理数组元素来执行非常具体的操作。此方法无法处理在函数调用中进行的许多内存分配。我并不是说这两个例子没有释放内存。我认为场景节点应该有一个方法来释放它下面的所有内存。