2011-06-16 79 views
0

我想不通爲什麼內存在增加,它的每個運行此代碼停留的時間有:的setInterval JavaScript的內存泄漏

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; 
}; 
}; 

我離開了一些不重要的代碼。 ideea是我從外部調用show()函數。 setInterval被初始化並運行了大約100次的processFrame()。

我試圖從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(); 
    } 
}; 

但記憶仍能增加。

+0

我看不出任何根本上錯誤的代碼。記憶力增加有多大,你如何衡量以及你使用的是什麼JavaScript引擎? 瀏覽器已知泄漏一些內存,並有很多方法來測量... – cellcortex 2011-06-16 08:43:21

+0

我使用firefox進行測試,內存每次調用show()時會增加大約2-3 Mb的RAM。我正在使用任務管理器來測量firefox進程。 – gabitzish 2011-06-16 08:48:00

回答

0

我發現了這個問題。我不斷重畫畫布。要解決這個問題,我必須在修改它之前每次擦除畫布。

0

嘗試使用JSLint驗證您的代碼。 http://www.jslint.com/

現在您將添加easingFunction & processFrame添加到Global對象(這不是一件好事)。不是說這是問題的原因,但我發現對象管理不當是內存泄漏的常見原因。

你想要做的事,如:

var MyObject = {}; 

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

總之要確保你使用它們之前聲明與var的所有對象。