【发布时间】: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