Newer
Older
pixi.js / src / core / renderers / webgl / TextureGarbageCollector.js
@Ivan Popelyshev Ivan Popelyshev on 20 Mar 2016 1 KB removing it

var CONST = require('../../const');

/**
 * @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.mode = CONST.GC_MODES.DEFAULT

    this._removedIndices = [];
}

TextueGarbageCollector.prototype.constructor = TextueGarbageCollector;
module.exports = TextueGarbageCollector;

TextueGarbageCollector.prototype.update = function()
{
    if(this.mode === CONST.GC_MODES.MANUAL)return;

    this.count++;
    this.checkCount++;


    if(this.checkCount > this.checkCountMax)
    {
        this.checkCount = 0;

        this.run();
    }
}

TextueGarbageCollector.prototype.run = function()
{
    var managedTextures =  this.renderer.textureManager._managedTextures;

    var removed = this._removedIndices;
    removed.length = 0;
    var i,j;
    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();
        }
    }
    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;
        removed.length = 0;
    }
}