5

javascript でゲームを作成していますが、ゲームループが 30 ミリ秒ごとに呼び出されます。タスク マネージャーが Firefox のメモリ使用量を約 20 秒で 400 MB 増加させるため、大量のメモリ リークが発生します。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);

OK、いくつかのコードをコメントアウトして、問題のある行を見つけました。

ship.ship.rotate(角度); その行をコメントした後、javascript は 4500K を使用しています。これが問題を引き起こしている理由と、このコードなしでオブジェクトを回転させるにはどうすればよいですか?

4

2 に答える 2

3

RaphaelJSの回転のドキュメントには、次のように記載されています。

要素の変換のリストに、指定された点を中心に指定された角度で回転を追加します。

それは確かに潜在的な犯人のように聞こえます. そこにある重要な言葉はaddlistです。

要素を 2 回回転すると、変換関数は何を表示しますか? 私の疑いは、回転する呼び出しがますます大きな変換文字列を蓄積することです。それが起こっている場合は、変換をリセットできます。

el.transform("");

これで、表示されている問題が解決するはずです。

于 2012-01-05T04:20:09.650 に答える
2

あなたのコード スニペットには、メモリ リークの原因となるものは何もありません。

Eugen Rieck が指摘したように、Firefox (およびその他) は、実際に実行する理由があるまで、GC を実行したり、割り当てたメモリを解放したりしないことがあります。

コードに実際にリークがあるかどうかを確認するために、実際のメモリ プロファイリング ツールを使用してみましたか? Firefox にあるかどうかはわかりませんが、少なくとも Chrome にはあります。

于 2012-01-05T00:02:42.757 に答える