Esta es la solución más exacta que encomtrarás dar, sin embargo mírala detenidamente y valora si se adapta a tu trabajo.
Solución:
Esto debería hacer el trabajo:
function disposeNode (node)
if (node instanceof THREE.Mesh)
if (node.geometry)
node.geometry.dispose ();
if (node.material)
if (node.material instanceof THREE.MeshFaceMaterial)
$.each (node.material.materials, function (idx, mtrl)
if (mtrl.map) mtrl.map.dispose ();
if (mtrl.lightMap) mtrl.lightMap.dispose ();
if (mtrl.bumpMap) mtrl.bumpMap.dispose ();
if (mtrl.normalMap) mtrl.normalMap.dispose ();
if (mtrl.specularMap) mtrl.specularMap.dispose ();
if (mtrl.envMap) mtrl.envMap.dispose ();
if (mtrl.alphaMap) mtrl.alphaMap.dispose();
if (mtrl.aoMap) mtrl.aoMap.dispose();
if (mtrl.displacementMap) mtrl.displacementMap.dispose();
if (mtrl.emissiveMap) mtrl.emissiveMap.dispose();
if (mtrl.gradientMap) mtrl.gradientMap.dispose();
if (mtrl.metalnessMap) mtrl.metalnessMap.dispose();
if (mtrl.roughnessMap) mtrl.roughnessMap.dispose();
mtrl.dispose (); // disposes any programs associated with the material
);
else
if (node.material.map) node.material.map.dispose ();
if (node.material.lightMap) node.material.lightMap.dispose ();
if (node.material.bumpMap) node.material.bumpMap.dispose ();
if (node.material.normalMap) node.material.normalMap.dispose ();
if (node.material.specularMap) node.material.specularMap.dispose ();
if (node.material.envMap) node.material.envMap.dispose ();
if (node.material.alphaMap) node.material.alphaMap.dispose();
if (node.material.aoMap) node.material.aoMap.dispose();
if (node.material.displacementMap) node.material.displacementMap.dispose();
if (node.material.emissiveMap) node.material.emissiveMap.dispose();
if (node.material.gradientMap) node.material.gradientMap.dispose();
if (node.material.metalnessMap) node.material.metalnessMap.dispose();
if (node.material.roughnessMap) node.material.roughnessMap.dispose();
node.material.dispose (); // disposes any programs associated with the material
// disposeNode
function disposeHierarchy (node, callback)
for (var i = node.children.length - 1; i >= 0; i--)
var child = node.children[i];
disposeHierarchy (child, callback);
callback (child);
y lo usas
disposeHierarchy (YOUR_OBJECT3D, disposeNode);
Modifiqué la ya increíble respuesta de gaitat para usar la función de recorrido de escena ahora incorporada, para eliminar $ y también manejar MultiMaterial. ¿Por qué, oh, ¿por qué no hay una limpieza de memoria integrada en TRES? Seguramente debería hacerlo cuando hagas scene.dispose (). Todavía estoy tratando de rastrear un par de texturas más que estoy usando, pero parece que no me deshago () de acuerdo con renderer.info.memory.textures
this.disposeNode = function (parentObject)
parentObject.traverse(function (node)
if (node instanceof THREE.Mesh)
if (node.geometry)
node.geometry.dispose();
if (node.material)
if (node.material instanceof THREE.MeshFaceMaterial
);
Partiendo de las respuestas aquí, este código maneja matrices de materiales.
function disposeNode(parentObject)
parentObject.traverse(function (node)
if (node instanceof THREE.Mesh)
if (node.geometry)
node.geometry.dispose();
if (node.material)
);
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)