【问题标题】:Three.js r89 memory leak with STL modelsThree.js r89 内存泄漏与 STL 模型
【发布时间】:2018-01-12 00:08:24
【问题描述】:

我正在构建的页面有点问题。我认为这相当简单,但我很快就遇到了我认为是内存泄漏的问题。

首先,我花了一天的大部分时间寻找答案,所以如果我错过了一些明显的问题,我很抱歉,我保证我已经尝试过了。我发现的一切都指向了我目前正在使用的方法,我现在不知所措。

我有 30 个 STL 模型,我可以在它们之间交换所有 120kb 或更少的模型。一次只有 3 个出现在屏幕上,观众可以将它们换掉以自定义完整的模型。

我目前使用以下方法更改模型的颜色:

var selectedObject = scene.getObjectByName(object);

newMaterial = '#'+matHex[newMaterial-1];
newMaterial = hexToRgb(newMaterial);

selectedObject.material.color = newMaterial;

这部分工作得很好,似乎没有减慢任何速度。

在更换我使用的模型时:

var mesh = scene.getObjectByName(object);

if (mesh instanceof THREE.Mesh)
{
    scene.remove(mesh);
    mesh.geometry.dispose();
    mesh.geometry = null;
    mesh.material.dispose();
    mesh.material = null;
    mesh = null;
}

之后我调用一个函数将模型添加回场景中:

function addHandle(){
    loader.load( stlPath+'Handle'+handleID+'.stl', function ( geometry ) {
    material = '0x'+matHex[handleMat-1]; //set color hex from array

    var handleMaterial = new THREE.MeshPhongMaterial( { color: parseInt(material), specular: specular, shininess: shininess } );
    var handleMesh = new THREE.Mesh( geometry, handleMaterial );

    handleMesh.position.set( 0, 0, 0 );
    handleMesh.rotation.set( Math.PI/2, - Math.PI/2, 0 );
    handleMesh.scale.set( .008, .008, .008 );
    handleMesh.name = "Handle";
    handleMesh.id = handleID;
    handleMesh.castShadow = true;
    handleMesh.receiveShadow = true;
    scene.add( handleMesh );

    updateHandle(); //check if Handle needs to rotate
    } );
}

从我所能找到的一切来看,这是处理网格的正确方法,但是在运行了大约十几个网格后,相机旋转开始减慢,加载下一个模型需要稍长的时间,等等。在移动设备上尤其明显。

希望有人能够注意到我遗漏的一些明显的东西,我们将不胜感激!

【问题讨论】:

  • 你的材料有纹理吗?如果是这样,您可能想做mesh.material.map.dispose() 之类的事情。但是这里只有大约 4mb 的模型,我认为你可以将所有模型保存在内存中,甚至在交换东西时不需要处理它们......事实上我会尝试这样做,并且 not 每次都重新加载模型,或者尝试销毁模型之间的加载器,以防它正在缓存东西。
  • 目前我唯一添加到模型中的是颜色,没有纹理。我们认为这也不应该引起问题,但在旧款手机(三星 S4)上,它只需要进行几次模型更新,就会开始减慢相机的移动速度。一台计算机,我可以重新加载数百次,然后才明显。我会尝试破坏装载机,看看是否有帮助。我使用同一个来加载所有内容,所以如果它是缓存,那将是有意义的。

标签: javascript memory-leaks three.js


【解决方案1】:

我想我解决了问题,我怀疑是我的错。我发现我正在调用 animate();每次更换模型时。删除这些后,它运行起来要顺畅得多。如果最终没有修复,我会报告!

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2011-10-16
    • 2019-08-08
    • 2012-08-21
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多