diff --git a/src/core/renderers/webgl/TextureGarbageCollector.js b/src/core/renderers/webgl/TextureGarbageCollector.js index 550fadf..61ae947 100644 --- a/src/core/renderers/webgl/TextureGarbageCollector.js +++ b/src/core/renderers/webgl/TextureGarbageCollector.js @@ -15,7 +15,9 @@ this.maxIdle = 60 * 60; this.checkCountMax = 60 * 10; - this.mode = CONST.GC_MODES.DEFAULT; + this.mode = CONST.GC_MODES.DEFAULT + + this._removedIndices = []; } TextueGarbageCollector.prototype.constructor = TextueGarbageCollector; @@ -28,29 +30,45 @@ this.count++; this.checkCount++; - + if(this.checkCount > this.checkCountMax) { this.checkCount = 0; this.run(); - } + } } TextueGarbageCollector.prototype.run = function() { var managedTextures = this.renderer.textureManager._managedTextures; - for (var i = 0; i < managedTextures.length; i++) { - - var texture = managedTextures[i]; - - // only supports non generated textures at the moment! - if( !texture._glRenderTargets && this.count - texture.touched > this.maxIdle) - { - texture.dispose(); - i--; + var removed = this._removedIndices; + removed.length = 0; + var i,j; + try { + this.renderer.textureManager._cleaning = true; + for (i = 0; i < managedTextures.length; i++) { + var texture = managedTextures[i]; + // only supports non generated textures at the moment! + if (!texture._glRenderTargets && this.count - texture.touched > this.maxIdle) { + removed.push(i); + texture.dispose(); + } } - - }; + } finally { + this.renderer.textureManager._cleaning = false; + if (removed.length>0) { + for (i = 0; i < removed.length; i++) { + managedTextures[i] = null; + } + j = 0; + for (var i = 0; i < managedTextures.length; i++) { + if (managedTextures[i] != null) { + managedTextures[j++] = managedTextures[i]; + } + } + managedTextures.length = j; + } + } } diff --git a/src/core/renderers/webgl/TextureGarbageCollector.js b/src/core/renderers/webgl/TextureGarbageCollector.js index 550fadf..61ae947 100644 --- a/src/core/renderers/webgl/TextureGarbageCollector.js +++ b/src/core/renderers/webgl/TextureGarbageCollector.js @@ -15,7 +15,9 @@ this.maxIdle = 60 * 60; this.checkCountMax = 60 * 10; - this.mode = CONST.GC_MODES.DEFAULT; + this.mode = CONST.GC_MODES.DEFAULT + + this._removedIndices = []; } TextueGarbageCollector.prototype.constructor = TextueGarbageCollector; @@ -28,29 +30,45 @@ this.count++; this.checkCount++; - + if(this.checkCount > this.checkCountMax) { this.checkCount = 0; this.run(); - } + } } TextueGarbageCollector.prototype.run = function() { var managedTextures = this.renderer.textureManager._managedTextures; - for (var i = 0; i < managedTextures.length; i++) { - - var texture = managedTextures[i]; - - // only supports non generated textures at the moment! - if( !texture._glRenderTargets && this.count - texture.touched > this.maxIdle) - { - texture.dispose(); - i--; + var removed = this._removedIndices; + removed.length = 0; + var i,j; + try { + this.renderer.textureManager._cleaning = true; + for (i = 0; i < managedTextures.length; i++) { + var texture = managedTextures[i]; + // only supports non generated textures at the moment! + if (!texture._glRenderTargets && this.count - texture.touched > this.maxIdle) { + removed.push(i); + texture.dispose(); + } } - - }; + } finally { + this.renderer.textureManager._cleaning = false; + if (removed.length>0) { + for (i = 0; i < removed.length; i++) { + managedTextures[i] = null; + } + j = 0; + for (var i = 0; i < managedTextures.length; i++) { + if (managedTextures[i] != null) { + managedTextures[j++] = managedTextures[i]; + } + } + managedTextures.length = j; + } + } } diff --git a/src/core/renderers/webgl/TextureManager.js b/src/core/renderers/webgl/TextureManager.js index 8987c3d..196f55a 100644 --- a/src/core/renderers/webgl/TextureManager.js +++ b/src/core/renderers/webgl/TextureManager.js @@ -33,6 +33,13 @@ * @private */ this._managedTextures = []; + + /** + * While its true, no texture will be removed from _managedTextures array + * @type {boolean} + * @private + */ + this._isCleaning = false; }; TextureManager.prototype.bindTexture = function() @@ -120,8 +127,8 @@ } } else - { - // the textur ealrady exists so we only need to update it.. + { + // the textur ealrady exists so we only need to update it.. if(isRenderTexture) { texture._glRenderTargets[this.renderer.CONTEXT_UID].resize(texture.width, texture.height); @@ -158,7 +165,7 @@ delete texture._glTextures[this.renderer.CONTEXT_UID]; - if (!_skipRemove) + if (!_skipRemove && !this._isCleaning) { var i = this._managedTextures.indexOf(texture); if (i !== -1) {