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?
¿Cuál es la definición de 'Player'? –
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. –
¿Qué versión de Firefox? Antes de 7.0 FF haría un GC solo si alcanza un límite superior fijo de RAM ... –