2012-01-04 75 views
5

我在javascript中創建遊戲,每30ms調用我的gameloop,它會泄漏大量內存,因爲任務管理器在大約20秒內顯示firefox內存使用量增加400mb。 我不熟悉如何確保內存在JavaScript中收集。遊戲循環中的內存泄漏

function GameLoop(tick) { 
    move(player1.ship); 
} 

function Player(name) { 
    this.id = 0; 
    this.name = name; 
    this.ship = Ship(this); 
} 

function Ship(player) { 
    this.pos = [1024/2, 768/2]; 
    this.vel = [0, 0]; 
    this.angle = 0; 
    this.acc = 0; 
    this.thrust = 0; 
    this.west = 0; 
    this.east = 0; 
    this.turnRate = 5; 
    this.player = player; 
    this.size = [40, 40]; 
    this.ship = canvas.rect(this.pos[0], this.pos[1], this.size[0], this.size[1]); 
    this.ship.attr("fill", "red"); 

    return this; 
} 

function move(ship) { 
    var angle = ship.angle; 
    var max_speed = 20; 
    var acc_speed = 300; 

    var acc = 0; 
    if (ship.thrust) { 
    acc = 0.25 * acc_speed; 
    } 
    else { //slow down 
    if ((acc - (0.25 * acc_speed)) > 0) { 
     acc -= 0.25 * acc_speed; 
    } 

    else { 
     acc = 0; 
    } 
    } 

    var speedx = ship.vel[0] + acc * Math.sin(angle); 
    var speedy = ship.vel[1] - acc * Math.cos(angle); 
    var speed = Math.sqrt(Math.pow(speedx,2) + Math.pow(speedy,2)); 

    var speedx = ship.vel[0] + acc; 
    var speedy = ship.vel[1] - acc; 
    var speed = speedx + speedy; 

    if (speed > max_speed) { 
    speedx = speedx/speed * max_speed; 
    speedy = speedy/speed * max_speed; 
    } 
    ship.vel = [speedx, speedy]; 
    ship.pos = [ship.pos[0] + speedx * 0.25, ship.pos[1] + speedy * 0.25]; 
    ship.ship.attr({x: ship.pos[0], y: ship.pos[1]}); 
    ship.ship.rotate(angle); 
    ship.angle = 0; 

    delete this.thrust; 
    delete this.west; 
    delete this.east; 
    delete old_angle; 
    delete angle; 
    delete max_speed; 
    delete acc_speed; 
    delete acc; 
    delete speedx; 
    delete speedy; 
    delete speed; 

    return this; 
} 

var player1 = new Player("Player 1"); 
setInterval(GameLoop, 30); 

確定我註釋掉一些代碼,並已發現有問題的行,其

ship.ship.rotate(角度); 在發表評論後,JavaScript使用4500K。 任何想法,爲什麼這是造成這個問題,以及如何仍然旋轉我的對象沒有這一點的代碼?

+0

'Player'的定義是什麼? – 2012-01-04 23:46:58

+0

沒有什麼會泄漏,當然沒有什麼會泄漏幾乎1MB /循環。你如何顯示實際_does_的代碼?例如移動動畫?就像現在一樣,你只是改變'ship.angle','thrust'和'vel',而不是對它們做任何事情。 – 2012-01-04 23:47:49

+0

哪個版本的Firefox? 7.0 FF只有在達到RAM的固定上限時纔會執行GC ... – 2012-01-04 23:49:13

回答

3

的RaphaelJS rotate文檔說以下內容:

給出角度旋轉再添四處給定點的元素轉換的列表中。

這聽起來像是一個潛在的罪魁禍首。關鍵詞有列表

當您旋轉元素兩次時,transform函數會顯示什麼?我懷疑是輪流呼叫積累了越來越大的轉換字符串。如果發生了這種情況,您可以重置變換,您可以重置變換,

el.transform(""); 

並且應該清除您看到的問題。

+0

非常感謝,一切都在控制之下。 – 2012-01-06 05:16:03

2

我沒有在您的代碼片段中看到任何會泄漏內存的內容。

正如Eugen Rieck指出的那樣,Firefox(和其他人)有時候不會分配GC和/或空閒內存,直到他們真的有理由這樣做。

您是否嘗試過使用實際的內存分析工具來查看您的代碼實際上是否泄漏?我不確定Firefox是否有,但至少在Chrome中有一個。

+0

我已經在Chrome中打開它,Chrome任務管理器每秒使用大約2000K。 – 2012-01-05 00:11:21

+0

嘗試使用Chrome開發工具的Profiler獲取堆快照併發布結果。我仍然不確定你在問題中發佈的代碼是不是罪魁禍首。 – 2012-01-05 00:21:18

+0

不完全確定我要發佈的內容,但在「對象」下,它獲得了900多個名爲「Object @ 34866X」或類似內容的其他對象,每個對象都佔用2KB左右。 – 2012-01-05 00:30:50