2014-01-25 2 views
11

Я использую OBJLoader.js. У меня есть кнопка, которая при нажатии удаляет 3d-модель из сцены и добавляет новую, но каждый раз, когда загружается модель, использование памяти в хроме увеличивается примерно на 50 МБ и не уменьшается. Я попытался «dispose()» и null, но не очень полезен. Существует функция анимации, которая вызывается каждую секунду, которая отображает сцену с помощью средства визуализации.three.js ObjLoader Memory Увеличивает

function freeMemory(model) { 
if (model instanceof THREE.Mesh) { 
    var texMat = model.material; 
    texMat.map.dispose(); 
    texMat.map = null; 
    texMat.dispose(); 
    texMat = null; 
    model.geometry.dispose(); 
    model.geometry = null; 
    model = null; 
} 
} 

function loadModel() { 
scene.remove(model); 
freeMemory(model); 
var loader = new THREE.OBJLoader(); 
loader.load('test3d.obj', function(object) { 
    object.children[0].geometry.computeFaceNormals(); 
    geometry = object.children[0].geometry; 
    console.log(geometry); 
    geometry.dynamic = true; 
    var modelTexture = THREE.ImageUtils.loadTexture("models/tex_0.jpg"); 
    object.traverse(function(child) { 
     if (child instanceof THREE.Mesh) { 
      child.material.map = modelTexture; 
      model = child; 
      model.scale.set(0.5, 0.5, 0.5); 
      model.translateOnAxis(new THREE.Vector3(1, 0, 1).normalize(), 
        1.5); 
      model.rotation.x = 0; 
      model.rotation.y = 0; 
      model.rotation.z = 0; 
      modelInitialPositionX = model.position.x; 
      modelInitialPositionY = model.position.y; 
      modelInitialPositionZ = model.position.z; 
      scene.add(model); 
     } 
    }); 
    modelTexture.dispose(); 
    modelTexture = null; 
}); 
loader = null; 
} 

У меня там какая-либо передовая практика, которую я могу использовать при добавлении и удалении .obj и текстур при нажатии кнопки.

+0

http://stackoverflow.com/a/33199591/1980846 – gaitat

ответ

0

Попытка остановить анимацию, с помощью следующего кода:

animate(){ 
    this.requestId = requestAnimationFrame(this.animate.bind(this)); 
    this.render(); 
} 
render(){ 
    this.renderer.render(this.scene, this.camera); 
} 
stop(){ 
    window.cancelAnimationFrame(this.requestId); 
} 
Смежные вопросы