繁体   English   中英

游戏循环中的内存泄漏

[英]memory leak on game loop

我正在用javascript创建一个游戏,并且我的gameloop每30毫秒被调用一次,它会泄漏大量内存,因为任务管理器显示Firefox内存使用量在20秒内增加了400mb。 我不熟悉如何确保在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);

好的,我注释掉了一些代码,并找到了令人反感的行

ship.ship.rotate(angle); 评论该行后,javascript正在使用4500K。 知道为什么这会导致问题吗?如果没有这段代码,如何仍然可以旋转对象?

RaphaelJS中的rotate文档指出以下内容:

将围绕给定点的给定角度的旋转添加到元素的转换列表中。

这无疑是一个潜在的罪魁祸首。 关键词是addlist

旋转元素两次时, 变换功能会显示什么? 我的怀疑是旋转调用会累积越来越大的转换字符串。 如果发生这种情况,您可以重置转换,

el.transform("");

这应该可以解决您遇到的问题。

我在您的代码段中看不到任何会泄漏内存的内容。

正如Eugen Rieck所指出的那样,Firefox(及其他)有时不执行GC和/或已分配的可用内存,直到他们真正有理由这样做为止。

您是否尝试过使用实际的内存分析工具来查看代码是否确实泄漏? 我不确定Firefox是否有一个,但Chrome中至少有一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM