spite / THREE.MeshLine

Mesh replacement for THREE.Line
MIT License
2.14k stars 381 forks source link

Memory leak #56

Closed argorus closed 5 years ago

argorus commented 6 years ago

It happens when I use function setGeometry in a real time (inside a redrawing function of my project). Can you fix it or explain other ways to update geometry of lines?

spite commented 6 years ago

How are you updating the geometry passed to setGeometry? Can i see the relevant piece of code?

argorus commented 6 years ago
for(var i = 0; i < 2; i++)
        {
            var circlesGeometry = new THREE.Geometry();
            if( i == 0)
            {               
                for(var j = 0; j < (cLength*(bSum*20 + 4))/360; j += cLength/360) 
                {
                    var v = new THREE.Vector3();
                    v.set( 300*Math.cos(j), 300*Math.sin(j), 0);
                    circlesGeometry.vertices.push(v);
                }
            }
            else
            {
                for(var j = cLength/2; j < ((cLength*(bSum*20 + 4))/360 + cLength/2); j += cLength/360) 
                {
                    var v = new THREE.Vector3();
                    v.set( 300*Math.cos(j), 300*Math.sin(j), 0);
                    circlesGeometry.vertices.push(v);
                }
            }
            var mesh = scene.getObjectByName("circleX" + i);
            var curve_line = new MeshLine();
            curve_line.setGeometry(circlesGeometry);
            var new_mesh = new THREE.Mesh(curve_line.geometry, mesh.material);
            scene.remove(mesh);
            new_mesh.name = "circleX" + i;
            scene.add(new_mesh);
            new_mesh.position.z = -1900;
        }
argorus commented 6 years ago

It's a part of function "draw" which called using 'requestAnimationFrame'.

spite commented 6 years ago

scene.remove basically removes a child from its parent, but doesn't dispose of it.

THREE.MeshLine keeps its own internal THREE.BufferGeometry and resizes it accordingly. I think in your case you're not disposing of the original THREE.Geometry. Try calling .dispose() on circlesGeometry after .setGeometry and see if it helps with the leak.

argorus commented 6 years ago

Unfortunately, it doesn't work. image

yaodianmi commented 5 years ago

I have the same problem

mfurniss commented 5 years ago

I'm seeing a memory leak too. I'm spawning around 10 animated lines per second, and removing the lines when no longer required. The memory heap keeps growing and eventually crashes the app.

AlexVestin commented 5 years ago

You need to do all three geometry.dispose(), material.dispose() and scene.remove and there's no (at least from what I can notice) memory leak.

argorus commented 5 years ago

It helped to me using "mesh.material.dispose()" and "mesh.geometry.dispose()" in all places where i remove objects from scene. Now I haven't any memory leaks in my project. Thanks!