在three.js中,我们简单调用remove函数来移除模型的时候,并不能完全清理模型,它的网格和贴图,材质依然还在内存中,如果频繁调用remove,很可能会出现内存泄漏,导致浏览器崩溃的情况,这里给出一个简单的清理模型的方法:
var disposeResource=function (obj) {
if (!!obj) {
if (Array.isArray(obj)) {
const objCopy = obj.slice();
while (objCopy.length > 0) {
disposeResource(objCopy.pop());
}
return;
}
if (obj instanceof THREE.Object3D) {
if (!!obj.parent) {
obj.parent.remove(obj);
}
if (!!obj.geometry) {
disposeResource(obj.geometry);
}
if (!!obj.material) {
disposeResource(obj.material);
}
if (!!obj.children && obj.children.length > 0) {
disposeResource(obj.children);
}
}
else if (obj instanceof THREE.Material) {
for (const val of Object.values(obj)) {
if (val instanceof THREE.Texture) {
disposeResource(val);
}
}
if (!!obj.uniforms) {
for (const val of Object.values(obj.uniforms)) {
if (!!val) {
const uniformValue = val.value;
if (uniformValue instanceof THREE.Texture || Array.isArray(uniformValue)) {
disposeResource(uniformValue);
}
}
}
}
}
if (!!obj.dispose) {
obj.dispose();
}
}
}