2012-01-04 14 views
5

Sto creando un gioco in javascript e il mio gameloop si chiama ogni 30ms, perde molta memoria in quanto il task manager mostra l'utilizzo della memoria di Firefox per aumentare di 400mb in circa 20 secondi. Non ho familiarità con come assicurarsi che la memoria sia raccolta in javascript.sul loop di gioco

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 ho commentato un qualche codice e hanno trovato la riga all'origine, la sua

ship.ship.rotate (angolo); Dopo aver commentato che line out javascript sta usando 4500K. qualsiasi idea del perché questo sta causando il problema, e come posso ancora ruotare il mio oggetto senza questo bit di codice?

+0

Qual è la definizione di 'Player'? –

+0

non c'è nulla che possa fuoriuscire, certamente niente che potrebbe perdere quasi 1 MB/loop. Che ne dici di mostrare il codice che in realtà _ fa qualcosa? per esempio. l'animazione di movimento? Come ora, stai solo cambiando "ship.angle',' thrust' e 'vel' e non facendo nulla con loro. –

+0

Quale versione di Firefox? Prima di 7.0 FF farebbe un GC solo se raggiunge un limite superiore fisso di RAM ... –

risposta

3

La documentazione di rotate nel RaphaelJS dice il seguente:

Aggiunge rotazione dato angolo intorno dato punto all'elenco delle trasformazioni dell'elemento.

Quello suona sicuramente come un potenziale colpevole. Le parole critiche sono aggiungere e lista.

Che cosa indica la funzione transform quando si ruota un elemento due volte? Il mio sospetto è che le chiamate per ruotare accumulino stringhe di trasformazione sempre più grandi. se è quello che sta succedendo, puoi resettare la trasformazione,

el.transform(""); 

e che dovrebbe risolvere il problema che stai vedendo.

+0

Grazie mille, tutto è sotto controllo di nuovo. –

2

Non vedo nulla nel frammento di codice che potrebbe perdere memoria.

Come sottolineato da Eugen Rieck, Firefox (e altri) a volte non eseguono GC e/o memoria libera assegnata finché non hanno effettivamente un motivo per farlo.

Hai provato a utilizzare uno strumento di profilazione della memoria reale per vedere se il tuo codice è effettivamente perdente? Non sono sicuro che Firefox ne abbia uno, ma ce n'è uno almeno in Chrome.

+0

L'ho aperto in Chrome e il Task Manager di Chrome utilizza circa 2000K al secondo. –

+0

Prova a scattare alcune istantanee con gli strumenti di sviluppo di Chrome 'Profiler' e pubblica i risultati. Non sono ancora sicuro che il codice che hai pubblicato nella tua domanda sia il colpevole. –

+0

non è esattamente sicuro di cosa sto postando, ma sotto 'Oggetto' ha oltre 900 altri oggetti chiamati 'Object @ 34866X' o qualcosa di simile, ognuno dei quali occupa circa 2 KB circa. –