gpt4 book ai didi

Three.js Collada - dispose() 和释放内存(垃圾收集)的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-04 04:46:06 30 4
gpt4 key购买 nike

我已经通过 ColladaLoader 成功导入了一个 .dae 场景。

问题是,我需要在几个 .dae 文件之间切换。

我似乎无法正确实现 dispose 方法。

        dae.traverse(function(obj) {

console.log('unloading ' + obj.id);

scene.remove(obj);

if(obj.geometry)
obj.geometry.dispose();
if(obj.material)
obj.material.dispose();
if(obj.mesh)
obj.mesh.dispose();
if(obj.texture)
obj.texture.dispose();

});

scene.remove(dae);

我可能做错了什么?

非常感谢!

编辑:

这是整个代码。
    var renderer = null;
var scene = null;
var camera = null;
var controls = null;
var dae = null;
//var loader = null;

function init() {


renderer = new THREE.WebGLRenderer( { alpha: 1, antialias: true, clearColor: 0xffffff } );
renderer.setSize( 800, 600 );

var elem = $('.main3d')[0];
elem.appendChild( renderer.domElement );

scene = new THREE.Scene();

camera = new THREE.PerspectiveCamera( 20, 800/600, 1, 1000 );
camera.position.set( 0, -100, 50 );
//camera.lookAt( scene.position );
controls = new THREE.TrackballControls( camera, renderer.domElement );

var light = new THREE.AmbientLight( 0xffffff ); // soft white light
scene.add( light );

threeAnimate();


}

function load(url) {
loader = new THREE.ColladaLoader();

loader.load(url, function (collada) {
dae = collada.scene;
scene.add(dae);

});

}

function unload() {

dae.traverse(function(obj) {

console.log('unloading ' + obj.id);

scene.remove(obj);

if(obj.geometry)
obj.geometry.dispose();
if(obj.material)
obj.material.dispose();
if(obj.mesh)
obj.mesh.dispose();
if(obj.texture)
obj.texture.dispose();

});

scene.remove(dae);

}

var animFrame = null;
function animate() {

animFrame = requestAnimationFrame( threeAnimate );
renderer.render( scene, camera );
controls.update();

}

最佳答案

这应该可以完成这项工作:

function disposeNode (node)
{
if (node instanceof THREE.Mesh)
{
if (node.geometry)
{
node.geometry.dispose ();
}

if (node.material)
{
if (node.material instanceof THREE.MeshFaceMaterial)
{
$.each (node.material.materials, function (idx, mtrl)
{
if (mtrl.map) mtrl.map.dispose ();
if (mtrl.lightMap) mtrl.lightMap.dispose ();
if (mtrl.bumpMap) mtrl.bumpMap.dispose ();
if (mtrl.normalMap) mtrl.normalMap.dispose ();
if (mtrl.specularMap) mtrl.specularMap.dispose ();
if (mtrl.envMap) mtrl.envMap.dispose ();
if (mtrl.alphaMap) mtrl.alphaMap.dispose();
if (mtrl.aoMap) mtrl.aoMap.dispose();
if (mtrl.displacementMap) mtrl.displacementMap.dispose();
if (mtrl.emissiveMap) mtrl.emissiveMap.dispose();
if (mtrl.gradientMap) mtrl.gradientMap.dispose();
if (mtrl.metalnessMap) mtrl.metalnessMap.dispose();
if (mtrl.roughnessMap) mtrl.roughnessMap.dispose();

mtrl.dispose (); // disposes any programs associated with the material
});
}
else
{
if (node.material.map) node.material.map.dispose ();
if (node.material.lightMap) node.material.lightMap.dispose ();
if (node.material.bumpMap) node.material.bumpMap.dispose ();
if (node.material.normalMap) node.material.normalMap.dispose ();
if (node.material.specularMap) node.material.specularMap.dispose ();
if (node.material.envMap) node.material.envMap.dispose ();
if (node.material.alphaMap) node.material.alphaMap.dispose();
if (node.material.aoMap) node.material.aoMap.dispose();
if (node.material.displacementMap) node.material.displacementMap.dispose();
if (node.material.emissiveMap) node.material.emissiveMap.dispose();
if (node.material.gradientMap) node.material.gradientMap.dispose();
if (node.material.metalnessMap) node.material.metalnessMap.dispose();
if (node.material.roughnessMap) node.material.roughnessMap.dispose();

node.material.dispose (); // disposes any programs associated with the material
}
}
}
} // disposeNode

function disposeHierarchy (node, callback)
{
for (var i = node.children.length - 1; i >= 0; i--)
{
var child = node.children[i];
disposeHierarchy (child, callback);
callback (child);
}
}

你用它
disposeHierarchy (YOUR_OBJECT3D, disposeNode);

关于Three.js Collada - dispose() 和释放内存(垃圾收集)的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33152132/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com