var CONST = require('../../const');
/**
* TextureGarbageCollector. This class manages the GPU and ensures that it does not get clogged up with textures that are no longer being used.
*
* @class
* @memberof PIXI
* @param renderer {PIXI.WebGLRenderer} The renderer this manager works for.
*/
function TextureGarbageCollector(renderer)
{
this.renderer = renderer;
this.count = 0;
this.checkCount = 0;
this.maxIdle = 60 * 60;
this.checkCountMax = 60 * 10;
this.mode = CONST.GC_MODES.DEFAULT;
}
TextureGarbageCollector.prototype.constructor = TextureGarbageCollector;
module.exports = TextureGarbageCollector;
/**
* Checks to see when the last time a texture was used
* if the texture has not been used for a specified amount of time it will be removed from the GPU
*/
TextureGarbageCollector.prototype.update = function()
{
this.count++;
if(this.mode === CONST.GC_MODES.MANUAL)
{
return;
}
this.checkCount++;
if(this.checkCount > this.checkCountMax)
{
this.checkCount = 0;
this.run();
}
};
/**
* Checks to see when the last time a texture was used
* if the texture has not been used for a specified amount of time it will be removed from the GPU
*/
TextureGarbageCollector.prototype.run = function()
{
var tm = this.renderer.textureManager;
var managedTextures = tm._managedTextures;
var wasRemoved = false;
var i,j;
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)
{
tm.destroyTexture(texture, true);
managedTextures[i] = null;
wasRemoved = true;
}
}
if (wasRemoved)
{
j = 0;
for (i = 0; i < managedTextures.length; i++)
{
if (managedTextures[i] !== null)
{
managedTextures[j++] = managedTextures[i];
}
}
managedTextures.length = j;
}
};
/**
* Removes all the textures within the specified displayObject and its children from the GPU
*
* @param displayObject {PIXI.DisplayObject} the displayObject to remove the textures from.
*/
TextureGarbageCollector.prototype.unload = function( displayObject )
{
var tm = this.renderer.textureManager;
if(displayObject._texture)
{
tm.destroyTexture(displayObject._texture, true);
}
for (var i = displayObject.children.length - 1; i >= 0; i--) {
this.unload(displayObject.children[i]);
}
};