2011-06-17 39 views
4

我在HTML5的Canvas + JavaScript中制作游戏。我的CPU用于该选项卡每秒持续增长几个百分点,直到达到50%(全部为一个内核)。我正在成功地从对象数组中删除我的对象,但对象本身似乎仍然存在。我在几个地方尝试过“删除obj”和“obj = null”,但没有运气。CPU使用量持续增长;有没有办法在JavaScript中删除我的未使用的对象?

任何想法?

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); 
    } 
} 
+0

你能创建一个jsFiddle吗? – vol7ron 2011-06-17 01:39:17

+0

CPU使用率!=内存使用情况。如果您的选项卡分配的内存不断增加,那么您确实遇到未被删除的对象的问题。但是,挂钩的CPU表明您的问题在别处。 – josh3736 2011-06-17 01:42:09

+0

这里是小提琴:http://jsfiddle.net/wxEjb/ – Aaron 2011-06-17 01:48:51

回答

2

正如我在我的评论中提到的,CPU使用率!=的内存使用情况。借助Chrome的开发人员工具,您可以轻松地对应用程序进行配置,以便查找耗费所有CPU周期的代码。

打开您的应用程序,打开开发工具,然后转到配置文件选项卡。点击录制按钮(黑色圆圈)。它会变红; Chrome现在正在记录CPU使用情况。让它记录几秒钟,然后再次点击记录按钮。您现在将按功能查看CPU使用情况。

在这种情况下,我们可以看到,draw_grid()已经消耗92%的CPU时间–我们发现我们的罪魁祸首!

made some changesdraw_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以将变量的范围(本例中为ij)限制为本地函数。否则,你正在创建一个全局变量,由于各种原因,这是一个坏主意。
+0

谢谢!令人惊叹的答案。太棒了。现在我的CPU占用率为1%。 – Aaron 2011-06-17 02:50:35

0

您可能需要删除所有属性/除了删除指针(变量),但内存泄漏该对象的方法一直是困扰真实JavaScript的一个问题。

你有没有在setTimeout('',0)的地方抛出任何东西让处理器做一些其他的事情。

+0

当我把它放在我的主要游戏功能中时,CPU的使用确实增长得更慢,但最终仍然增长到50%/ max。 – Aaron 2011-06-17 02:01:50

+0

您可能会比CPU更快地删除东西,请尝试将其更改为50 – vol7ron 2011-06-17 02:56:18

相关问题