2012-12-02 63 views
0

我正在開發一款Flash遊戲,需要我在運行時將類的對象實例化到場景中,並通過代碼刪除這些對象。 這工作正常,我可以動態地添加和刪除遊戲中的實例,但大約兩分鐘後,它開始滯後極端,最終會一起崩潰。Flash actionscript 3遊戲性能 - 刪除對象並重置屬性

我用numchildren()追查有多少個對象在現場,則顯得有些實例都沒有被正確刪除,因爲跟蹤會增加,最終達到接近2000米的對象的數量...

我我正在使用removeChild()刪除這些對象,並試圖弄清楚爲什麼這些對象仍然在場景中。 我讀過某些地方,如果對象沒有正確重置,對象可能仍然使用CPU。

我對flash的工作還很陌生,我的主要問題是 - 如何找出哪些對象沒有被刪除,以及如何從遊戲中完全刪除它們?
除了簡單的removeChild()零件以外,還需要添加哪些代碼?
任何幫助將不勝感激。

回答

0

請提供使用removeChild()方法的代碼部分。

通常你應該使用removeChild之()是這樣的:

import flash.display.MovieClip; 
import flash.utils.Timer; 
import flash.events.TimerEvent; 

var movieClip:MovieClip; 
var timer:Timer=new Timer(5000, 1); 
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); 

makeMovieClips(); 

function makeMovieClips() { 
    for (var i:int; i<2000; i++) { 
     movieClip=new MovieClip(); 
     movieClip.graphics.beginFill(Math.random()*0xFFFFFF); 
     movieClip.graphics.drawCircle(Math.random()*stage.stageWidth, Math.random()*stage.stageHeight, Math.random()*40); 
     movieClip.graphics.endFill(); 
     addChild(movieClip); 
    } 
    trace (numChildren) // should output 2000; 
    timer.start(); 
} 

function onTimerComplete(e:TimerEvent):void { 
    while (numChildren>0) { 
     movieClip=getChildAt(0) as MovieClip; 
     removeChild(movieClip); 
     // or we can use removeChildAt(0); instead of 2 lines above 
    } 
    trace (numChildren) // should output 0, because all objects are removed from display list; 
} 

另外注意,刪除對象形成顯示列表中,將不會從記憶中排除,是否有任何引用留在這些對象。在我的示例中,在所有Movieclip從舞臺上移除後,對一個MovieClip對象的引用仍然保留,所以它將佔用VM內存的一部分,並且垃圾收集器不會清除該部分。在我的例子,除去參考,我應該while循環後onTimerComplete方法中添加這行代碼:

movieClip=null; 
+0

感謝您的答覆,我現在已經找到了所有未刪除的對象的原因,通過使用調試this.contains ()來查看某些對象是否仍然在場景中,事實證明,我只是忘記了在我的代碼的另一部分中添加removeChild()語句。然而,你的答案的第二部分是非常有用的知道 - 刪除參考..在我的代碼中,我一直保持着我實例化的所有對象的數組,這就是我如何引用它們。以下例子中的movieClip = null;刪除實例後,我將數組引用設置爲null。 – user1199434