2011-06-17 41 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

相關問題