утечка памяти javascript setInterval - PullRequest
0 голосов
/ 16 июня 2011

Я не могу понять, почему память увеличивается и остается там каждый раз, когда я запускаю этот код:

easingFunction = function (t, b, c, d) {
    if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;
    return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;
}
processFrame = function () {
    for (var i = 0; i < tiles.length; i++) {
        var tile = tiles[i];
        tile.percent += 4;
        if (tile.percent > 0) {
            var TH = Math.max(0, Math.min(TILE_HEIGHT, targetObj.height - tile.imageY));
            var TW = Math.max(0, Math.min(TILE_WIDTH, targetObj.width - tile.imageX));
            var SW, SH, SX, SY, amount;
            draw.save();
            draw.translate(tile.imageX, tile.imageY);
            if (direction == "tb" || direction == "bt") {
                amount = easingFunction(tile.percent, 0, TW, 100);
                SW = Math.min(TW, amount);
                SH = TH;
                SX = 0;
                SY = 0;
            } else {
                amount = easingFunction(tile.percent, 0, TH, 100);
                SW = TW;
                SH = Math.min(TH, amount);
                SX = 0;
                SY = 0;
            }
            draw.drawImage(copycanvas, tile.imageX, tile.imageY, SW, SH, SX, SY, SW, SH);
            draw.restore();
        }
    }
    var ok = true;
    for (i = 0; i < tiles.length; i++) {
        if (tiles[i].percent < 100) {
            ok = false;
            break;
        }
    }
    if (ok) {
        clearInterval(interval);
        showComplete();
    }
};
this.show = function (target, hideTarget) {
    createTiles();
    for (var i = 0; i < tiles.length; i++) {
        var tile = tiles[i];
        tile.percent = 0 - i * 10;
    }
}
var intervalDelay = (config.duration * 1000) / (tiles.length * 3 + 25);
interval = setInterval(function () {
    processFrame();
}, intervalDelay);
};

function Tile() {
    this.imageX = 0;
    this.imageY = 0;
    this.percent = 0;
};
};

Я пропустил какой-то неважный код.Идея в том, что я вызываю внешне функцию show ().SetInterval инициализируется и выполняет processFrame () около 100 раз.

Я пытался оставить некоторый код снаружи от processFrame, и я получил:

processFrame = function () {
    for (var i = 0; i < tiles.length; i++) {
        var tile = tiles[i];
        tile.percent += 4;
    }
    var ok = true;
    for (i = 0; i < tiles.length; i++) {
        if (tiles[i].percent < 100) {
            ok = false;
            break;
        }
    }
    if (ok) {
        clearInterval(interval);
        showComplete();
    }
};

Но память все еще увеличивается.

Ответы [ 2 ]

0 голосов
/ 03 августа 2011

Я нашел проблему. Я постоянно перерисовывал холст. Чтобы решить эту проблему, мне приходилось стирать холст каждый раз перед его изменением.

0 голосов
/ 16 июня 2011

Попробуйте проверить код с помощью JSLint. http://www.jslint.com/

Сейчас вы добавляете easingFunction & processFrame к глобальному объекту (что не очень хорошо). Не то чтобы это является причиной проблемы, но я обнаружил, что неправильное управление моими объектами является обычной причиной утечек памяти.

Вы захотите сделать что-то вроде:

var MyObject = {}; 

MyObject.easingFunction = function(){};
MyObject.processFrame = function(){};

Короче говоря, убедитесь, что вы объявили все объекты с var перед их использованием

...