diff --git a/src/core/renderers/webgl/TextureGarbageCollector.js b/src/core/renderers/webgl/TextureGarbageCollector.js new file mode 100644 index 0000000..6fcbc29 --- /dev/null +++ b/src/core/renderers/webgl/TextureGarbageCollector.js @@ -0,0 +1,48 @@ + +/** + * @class + * @memberof PIXI + * @param renderer {PIXI.WebGLRenderer} The renderer this manager works for. + */ +function TextueGarbageCollector(renderer) +{ + this.renderer = renderer; + + this.count = 0; + this.checkCount = 0; + this.maxIdle = 60 * 60; + this.checkCountMax = 60 * 10; + + this.enabled = true; +} + +TextueGarbageCollector.prototype.constructor = TextueGarbageCollector; +module.exports = TextueGarbageCollector; + +TextueGarbageCollector.prototype.update = function() +{ + if(! this.enabled )return; + + this.count++; + this.checkCount++; + + var managedTextures = this.renderer.textureManager._managedTextures; + + if(this.checkCount > this.checkCountMax) + { + this.checkCount = 0; + + 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--; + } + + }; + } +} \ No newline at end of file diff --git a/src/core/renderers/webgl/TextureGarbageCollector.js b/src/core/renderers/webgl/TextureGarbageCollector.js new file mode 100644 index 0000000..6fcbc29 --- /dev/null +++ b/src/core/renderers/webgl/TextureGarbageCollector.js @@ -0,0 +1,48 @@ + +/** + * @class + * @memberof PIXI + * @param renderer {PIXI.WebGLRenderer} The renderer this manager works for. + */ +function TextueGarbageCollector(renderer) +{ + this.renderer = renderer; + + this.count = 0; + this.checkCount = 0; + this.maxIdle = 60 * 60; + this.checkCountMax = 60 * 10; + + this.enabled = true; +} + +TextueGarbageCollector.prototype.constructor = TextueGarbageCollector; +module.exports = TextueGarbageCollector; + +TextueGarbageCollector.prototype.update = function() +{ + if(! this.enabled )return; + + this.count++; + this.checkCount++; + + var managedTextures = this.renderer.textureManager._managedTextures; + + if(this.checkCount > this.checkCountMax) + { + this.checkCount = 0; + + 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--; + } + + }; + } +} \ No newline at end of file diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index 9a29117..86fc3aa 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -5,6 +5,7 @@ RenderTarget = require('./utils/RenderTarget'), ObjectRenderer = require('./utils/ObjectRenderer'), TextureManager = require('./TextureManager'), + TextureGarbageCollector = require('./TextureGarbageCollector'), WebGLState = require('./WebGLState'), createContext = require('pixi-gl-core').createContext, mapWebGLDrawModesToPixi = require('./utils/mapWebGLDrawModesToPixi'), @@ -153,6 +154,8 @@ this._activeTexture = null; this.setBlendMode(0); + + } // constructor @@ -172,11 +175,13 @@ // create a texture manager... this.textureManager = new TextureManager(this); + this.textureGC = new TextureGarbageCollector(this); this.state.resetToDefault(); this.rootRenderTarget = new RenderTarget(gl, this.width, this.height, null, this.resolution, true); this.rootRenderTarget.clearColor = this._backgroundColorRgba; + this.bindRenderTarget(this.rootRenderTarget); @@ -242,6 +247,8 @@ this.currentRenderer.flush(); //this.setObjectRenderer(this.emptyRenderer); + this.textureGC.update(); + this.emit('postrender'); }; @@ -442,9 +449,11 @@ { // this will also bind the texture.. this.textureManager.updateTexture(texture); + } else { + texture.touched = this.textureGC.count; // bind the current texture texture._glTextures[this.CONTEXT_UID].bind(); } diff --git a/src/core/renderers/webgl/TextureGarbageCollector.js b/src/core/renderers/webgl/TextureGarbageCollector.js new file mode 100644 index 0000000..6fcbc29 --- /dev/null +++ b/src/core/renderers/webgl/TextureGarbageCollector.js @@ -0,0 +1,48 @@ + +/** + * @class + * @memberof PIXI + * @param renderer {PIXI.WebGLRenderer} The renderer this manager works for. + */ +function TextueGarbageCollector(renderer) +{ + this.renderer = renderer; + + this.count = 0; + this.checkCount = 0; + this.maxIdle = 60 * 60; + this.checkCountMax = 60 * 10; + + this.enabled = true; +} + +TextueGarbageCollector.prototype.constructor = TextueGarbageCollector; +module.exports = TextueGarbageCollector; + +TextueGarbageCollector.prototype.update = function() +{ + if(! this.enabled )return; + + this.count++; + this.checkCount++; + + var managedTextures = this.renderer.textureManager._managedTextures; + + if(this.checkCount > this.checkCountMax) + { + this.checkCount = 0; + + 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--; + } + + }; + } +} \ No newline at end of file diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index 9a29117..86fc3aa 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -5,6 +5,7 @@ RenderTarget = require('./utils/RenderTarget'), ObjectRenderer = require('./utils/ObjectRenderer'), TextureManager = require('./TextureManager'), + TextureGarbageCollector = require('./TextureGarbageCollector'), WebGLState = require('./WebGLState'), createContext = require('pixi-gl-core').createContext, mapWebGLDrawModesToPixi = require('./utils/mapWebGLDrawModesToPixi'), @@ -153,6 +154,8 @@ this._activeTexture = null; this.setBlendMode(0); + + } // constructor @@ -172,11 +175,13 @@ // create a texture manager... this.textureManager = new TextureManager(this); + this.textureGC = new TextureGarbageCollector(this); this.state.resetToDefault(); this.rootRenderTarget = new RenderTarget(gl, this.width, this.height, null, this.resolution, true); this.rootRenderTarget.clearColor = this._backgroundColorRgba; + this.bindRenderTarget(this.rootRenderTarget); @@ -242,6 +247,8 @@ this.currentRenderer.flush(); //this.setObjectRenderer(this.emptyRenderer); + this.textureGC.update(); + this.emit('postrender'); }; @@ -442,9 +449,11 @@ { // this will also bind the texture.. this.textureManager.updateTexture(texture); + } else { + texture.touched = this.textureGC.count; // bind the current texture texture._glTextures[this.CONTEXT_UID].bind(); } diff --git a/src/core/textures/BaseTexture.js b/src/core/textures/BaseTexture.js index 56213c2..c894448 100644 --- a/src/core/textures/BaseTexture.js +++ b/src/core/textures/BaseTexture.js @@ -18,6 +18,8 @@ EventEmitter.call(this); this.uid = utils.uid(); + + this.touched = 0; /** * The Resolution of the texture.