2012-01-04 11 views
5

Estoy creando un juego en javascript y mi gameloop se llama cada 30ms, pierde mucha memoria ya que el administrador de tareas muestra el uso de memoria de firefox para aumentar en 400mb en unos 20 segundos. No estoy familiarizado con cómo asegurarme de que la memoria se recopile en javascript.pérdida de memoria en el bucle del juego

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 I comentado a cabo algo de código y han encontrado la línea en cuestión, su

ship.ship.rotate (ángulo); Después de comentar que la línea javascript está usando 4500K. alguna idea de por qué esto está causando el problema, y ​​¿cómo puedo rotar mi objeto sin este código?

+0

¿Cuál es la definición de 'Player'? –

+0

no hay nada en eso que se filtre, ciertamente nada que gotee casi 1MB/loop. ¿Qué tal si muestras el código que realmente hace _ algo? p.ej. la animación de movimiento? Como está ahora, solo estás cambiando 'ship.angle',' thrust' y 'vel' y no estás haciendo nada con ellos. –

+0

¿Qué versión de Firefox? Antes de 7.0 FF haría un GC solo si alcanza un límite superior fijo de RAM ... –

Respuesta

3

La documentación de rotate en RaphaelJS dice lo siguiente:

Añade rotación por ángulo dado en torno dada punto a la lista de transformaciones del elemento.

Eso ciertamente suena como un posible culpable. Las palabras clave que hay agregan y lista.

¿Qué le muestra la función transform cuando gira un elemento dos veces? Sospecho que las llamadas a rotar acumulan cadenas de transformación cada vez más grandes. si eso es lo que está pasando, puede restablecer la transformación,

el.transform(""); 

y que debe solucionar el problema que se está viendo.

+0

Muchas gracias, todo está bajo control otra vez. –

2

No veo nada en el fragmento de código que pueda perder memoria.

Como señaló Eugen Rieck, Firefox (y otros) a veces no hacen GC y/o memoria libre que han asignado hasta que realmente tienen una razón para hacerlo.

¿Ha intentado utilizar una herramienta real de generación de perfiles de memoria para ver si su código es realmente defectuoso? No estoy seguro de si Firefox tiene uno, pero al menos hay uno en Chrome.

+0

Lo abrí en Chrome y el administrador de tareas de Chrome usa aproximadamente 2000K por segundo. –

+0

Intente tomar algunas instantáneas de montón con el Profiler de las herramientas de desarrollo de Chrome y publique los resultados. Todavía no estoy seguro de que el código que ha publicado en su pregunta sea el culpable. –

+0

no estoy seguro de lo que estoy publicando, pero en 'Objeto' tiene más de 900 objetos más llamados 'Objeto @ 34866X' o algo similar, cada uno ocupa alrededor de 2 KB más o menos. –