Saltar al contenido

Three.js Collada: ¿Cuál es la forma correcta de disponer () y liberar memoria (recolección de basura)?

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *