解除分配Object3D

时间:2013-02-01 16:27:49

标签: javascript memory-management three.js

我使用另外的mtl文件从obj文件加载模型。如何在r55中正确处理或取消分配返回的Object3D中的所有几何/材质/纹理?

3 个答案:

答案 0 :(得分:3)

试试这个:

object.traverse( function ( child ) {

    if ( child.geometry !== undefined ) {

        child.geometry.dispose();
        child.material.dispose();

    }

} );

答案 1 :(得分:1)

感谢mrdoob's example,我创建了一个递归处理three.js对象的函数。我将它添加到我的个人three.js util库中:https://github.com/MarcoSulla/my3

function dispose3(obj) {
    /**
     *  @author Marco Sulla (marcosullaroma@gmail.com)
     *  @date Mar 12, 2016
     */

    "use strict";

    var children = obj.children;
    var child;

    if (children) {
        for (var i=0; i<children.length; i+=1) {
            child = children[i];

            dispose3(child);
        }
    }

    var geometry = obj.geometry;
    var material = obj.material;

    if (geometry) {
        geometry.dispose();
    }

    if (material) {
        var texture = material.map;

        if (texture) {
            texture.dispose();
        }

        material.dispose();
    }
},

我希望这个函数将以Scene.remove方法添加到three.js代码中(只有在设置了可选标志时才可以调用)。

答案 2 :(得分:0)

我用这个:

function removeReferences(removeme){
  try{
    removeme.traverse(function(ob){
      try{
        renderer.deallocateObject(ob);
      }catch(e){} 
      try{
        ob.geometry.deallocate();
      }catch(e){}
      try{
        ob.material.deallocate();
      }catch(e){} 
      try{
        ob.deallocate()
      }catch(e){}
    });
  }catch(e){}
}