Ho importato con successo una scena .dae tramite ColladaLoader.Three.js Collada - Qual è il modo corretto di disporre() e rilasciare memoria (garbage collection)?
Il problema è che ho bisogno di passare tra diversi file .dae.
Non riesco a implementare correttamente il metodo di smaltimento.
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);
Cosa potrei fare eventualmente storto?
Grazie mille in anticipo!
EDIT:
Ecco l'intero codice.
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();
}
Wow! È abbastanza completo! Lo controllerò tra un po '. Grazie per aver trovato il tempo di rispondere! –
Voglio anche sapere se la risposta è basata sulla tua ricerca o se hai qualche fonte. Grazie ancora! –
Risposta stupenda! Sono stato in grado di rilasciare 700 MB + usando la funzione disposeHierarchy()! Semplicemente fantastico. Molte grazie. Spero che questa risposta aiuti anche gli altri. –