CPU使用量持续增长;有没有一种方法可以在JavaScript中删除我未使用的对象
CPU use keeps growing; is there a way to delete my unused objects in JavaScript?
我正在用HTML5的Canvas+JavaScript制作一个游戏。我在选项卡上的CPU使用量每秒都会增长几个百分点,直到达到50%(全部为一个核心)。我成功地从对象数组中删除了我的对象,但对象本身似乎仍然存在。我在一些地方尝试过"delete obj"answers"obj=null",但没有成功。
有什么想法吗?
var falling_blocks = setInterval(add_falling_block, 1000);
...
function add_falling_block(){
b = new Object();
b.x = (randFromTo(0,sq) * scale) - boff;
b.y = -scale + boff;
b.color = "#f00";
b.moving = true;
b.number = f.length;
f.push(b);
}
function draw_falling_blocks(){
var db = new Array()
for(i = 0; i < f.length; i++){
var ba = f[i];
if(ba.y < (bottom + scale)){
ba.y += scale;
draw_block(ba.x,ba.y,"#f00");
}
else if(ba.y = (bottom + scale)){
db.push(i);
console.log(f.length);
}
}
for(i = 0; i < db.length; i++){
f.splice(db[i],1);
}
}
正如我在评论中提到的,CPU使用!=
内存使用。使用Chrome的开发工具,可以很容易地对应用程序进行评测,以定位消耗所有CPU周期的代码。
打开您的应用程序,打开开发工具,然后转到Profiles选项卡。单击Record按钮(黑圈)。它会变成红色;Chrome现在正在记录CPU使用情况。让它记录几秒钟,然后再次单击"记录"按钮。现在,您将看到按功能划分的CPU使用情况。
在这种情况下,我们可以看到draw_grid()
已经消耗了92%的CPU时间–我们找到了罪魁祸首!
我对draw_grid
函数做了一些更改:
function draw_grid(){
c.strokeStyle = '#333';
for (var i = poff; i < w; i += scale) {
c.beginPath();
c.moveTo(0, i);
c.lineTo(w, i);
c.closePath();
c.stroke();
}
for (var j = poff; j < h; j += scale) {
c.beginPath();
c.moveTo(j, 0);
c.lineTo(j, h);
c.closePath();
c.stroke();
}
}
CPU使用率现在从未超过5%。
几个注意事项:
- 我添加了
beginPath()
和closePath()
,并将stroke()
移动到每个循环迭代中 - 我将每行的大小从常量500px更改为使用适当的变量
- 您只需要设置
strokeStyle
一次。除非您再次更改,否则它将保持不变 - 您应该在循环的初始值设定项中写入
var
,以将变量(在本例中为i
和j
)的作用域限制为本地函数。否则,您将创建一个全局变量,这是一个坏主意,原因多种多样
除了删除指针(变量)外,您可能还需要删除该对象的所有属性/方法,但内存泄漏一直是困扰JavaScript的问题。
您是否将setTimeout('',0)
放入任何位置,以允许处理器执行其他操作。
相关文章:
- 使用javascript删除上传的文件
- javascript删除事件侦听器
- 使用javascript删除元素时出现的问题
- 如何使用javascript删除以前的元素
- Javascript:删除冒号的最后一个字符
- 如何使用jQuery或JavaScript删除链接
- 如何在使用Javascript删除某一行时更新表
- 使用JavaScript删除多个select选项
- JavaScript删除未知侦听器
- JavaScript:删除动态创建的表
- JavaScript删除所有其他元素
- Javascript删除数组中某个位置之后的项
- 仅使用javascript删除多个选定的表行
- Javascript删除字段
- 使用Javascript删除字符串的内容
- JavaScript-删除last();工作不正常
- 使用 JavaScript 删除标签之间的每个空格
- 如何使用 MapReduce/Javascript 删除 riak 中的条目
- 当可见属性设置为 false 时,使用 JavaScript 删除空格
- 正则表达式匹配然后使用Javascript删除