javascript - 这可能导致性能泄露或者是其他原因?

  显示原文与译文双语对照的内容
0 0

我正在做一个你可以在这里测试的游戏: http://jaminweb.com/projs/snakegame.php

试着把速度设定为快速,并注意蛇在吃完食物后会变得更慢。 吃完它的食物 10次,它是suuuuuuper慢。 一定有一些性能泄漏,我找不到。

下面是当蛇点击食物时执行的代码的block:


 if (this.boxCollision(BBhead, BBfood))
 {
 this.moveFood(this.canvHeight, this.canvWidth);
 this.score += 10;
 document.getElementById("snake-score-div").innerHTML = this.score.toString();
 addLink = true;
 }
 if (addLink)
 this.body.push(this.body[this.body.length - 1].clone());

函数 moveFood的定义


 snakegame.prototype.moveFood = function()
 { 
 var bbf = this.food.getBBox();//bounding box for food
 do 
 {
//tx, ty: random translation units 
 tx = randInt(0, this.canvWidth/this.linkSize - 1) * this.linkSize - bbf.x;
 ty = randInt(0, this.canvHeight/this.linkSize - 1) * this.linkSize - bbf.y;
//translate copy of food
 this.food.translate(tx, ty);
//update bbf
 bbf = this.food.getBBox(); 
 } while (this.hitSnake(bbf));

 }

函数 clonetranslate 来自此库: http://raphaeljs.com/reference.html

那个过程让一切都变慢了。 知道为什么?

时间: 原作者:

0 0

如果你使用 Chrome 或者 Firefox,你可以在 console.time 中包装ceratin操作,以查看哪一个。 我推荐:


if (this.boxCollision(BBhead, BBfood))
{
 console.time('Moving food');
 this.moveFood(this.canvHeight, this.canvWidth);
 console.timeEnd('Moving food');

 console.time('Increasing score');
 this.score += 10;
 console.timeEnd('Increasing score');

 console.time('Updating score display');
 document.getElementById("snake-score-div").innerHTML = this.score.toString();
 console.timeEnd('Updating score display');

 addLink = true;
}
if (addLink) {
 console.time('Body clone');
 this.body.push(this.body[this.body.length - 1].clone());
 console.timeEnd('Body clone');
}

然后检查你的控制台并查看数字。

原作者:
...