diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 4299d95d1c5b5389a2661f0aef5acefdd9eb7d84..b4170a5cb3117ebca4e728af1b5883796f7db929 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -715,44 +715,34 @@ THREE.WebGLRenderer = function ( parameters ) { material.program = undefined; - // only deallocate GL program if this was the last use of shared program - // assumed there is only single copy of any program in the _programs list - // (that's how it's constructed) + for ( var i = 0, n = _programs.length; i !== n; ++ i ) { - var i, il, programInfo; - var deleteProgram = false; - - for ( i = 0, il = _programs.length; i < il; i ++ ) { - - programInfo = _programs[ i ]; + var programInfo = _programs[ i ]; if ( programInfo.program === program ) { - programInfo.usedTimes --; - - if ( programInfo.usedTimes === 0 ) { - - deleteProgram = true; - - } + var newReferenceCount = -- programInfo.usedTimes; - break; + if ( newReferenceCount === 0 ) { - } + // the last meterial that has been using the program let + // go of it, so remove it from the (unordered) _programs + // set and deallocate the GL resource - } + var newLength = n - 1; - if ( deleteProgram === true ) { + _programs[ i ] = _programs[ newLength ]; + _programs.pop(); - // avoid using array.splice, instead replace with last and pop + _gl.deleteProgram( program ); - _programs[ i ] = _programs[ il - 1 ]; - _programs.pop(); + _infoMemory.programs = newLength; + } - _gl.deleteProgram( program ); + break; - _infoMemory.programs --; + } }