2012-01-04 13 views
5

tworzę grę w javascript i mój gameloop nazywa co 30ms, to przecieki dużo pamięci jako menedżer zadań pokazuje zużycie pamięci firefox wzrośnie o 400MB w około 20 sekund. Nie wiem, jak upewnić się, że pamięć jest gromadzone w javascript.wyciek pamięci na pętli gry

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

Ok wykomentowane część kodu i znalezieniu linii naruszające jego

ship.ship.rotate (k); Po skomentowaniu tego wiersza javascript używa 4500K. jakikolwiek pomysł, dlaczego to powoduje problem, i jak mogę jeszcze obrócić obiekt bez tego fragmentu kodu?

+0

Jaka jest definicja 'Player'? –

+0

nie ma nic w tym, co wycieknie, na pewno nic, co wycieknie prawie 1 MB/pętli. A może pokazujesz kod, który faktycznie _ coś_? na przykład animacja ruchu? Jak to jest teraz, po prostu zmieniasz 'ship.angle',' thrust' i 'vel' i nic z nimi nie robisz. –

+0

Która wersja przeglądarki Firefox? Przed 7.0 FF wykonywałby GC tylko wtedy, gdyby trafił na ustalony górny limit pamięci RAM ... –

Odpowiedz

3

Dokumentacja rotate w RaphaelJS mówi co następuje:

Dodaje obrót o dany kąt wokół dany punkt do listy przemian elementu.

To z pewnością brzmi jak potencjalny winowajca. Krytyczne słowa istnieją dodać i listy.

Co oznacza transform Funkcja pokazu ty podczas obracania elementu dwukrotnie? Podejrzewam, że wezwania do rotacji gromadzą coraz większe i większe ciągi transformacji. jeśli tak się dzieje, możesz zresetować transformację, która powinna usunąć problem, który widzisz.

+0

Dziękuję bardzo, wszystko jest pod kontrolą ponownie. –

2

Nic nie widzę w fragmencie kodu, który mógłby spowodować wyciek pamięci.

Jak podkreślił Eugen Rieck, Firefox (i innych) czasami nie rób GC i/lub wolnej pamięci mają przydzielone aż faktycznie mają powód, aby to zrobić.

Czy próbowałeś zastosowanie rzeczywistej funkcji profilowania pamięci, aby sprawdzić, czy kod jest faktycznie nieszczelny? Nie jestem pewien, czy Firefox go ma, ale jest przynajmniej jeden w Chrome.

+0

Otworzyłem go w Chrome, a menedżer zadań Chrome używa około 2000 KB na sekundę. –

+0

Spróbuj zrobić kilka zrzutów sterty za pomocą narzędzia Profiler narzędzi Chrome i ogłosić wyniki. Nadal nie jestem pewien, czy kod, który opublikowałeś w swoim pytaniu, jest winowajcą. –

+0

nie jestem pewien, co publikuję, ale w "Object" jego ponad 900 innych obiektów o nazwie "Object @ 34866X" lub coś podobnego, z których każdy zajmuje około 2KB lub więcej. –