2012-11-21 24 views
2

我製作了一個Flash遊戲,您可以在其中駕駛飛機,並且必須抓住圈子並避免使用降落傘和其他東西。下面是遊戲的畫面讓你瞭解什麼即時通訊談論:Flash遊戲中的小孩的內存問題

Game Screenshot

,我有是內存使用,因爲我想將它移植到空氣iphone的問題。當菜單中沒有問題時,應用程序使用大約40 MB。但是當我在玩記憶時,就像箭頭一樣。我拍了一張Monster Debugger圖形的屏幕。那就是:

Memory Usage Screenshot

的事情是,我有各種類是從天上掉下來的每個元素。降落傘,衝浪者,圈子和獎金。他們都很相似,所以我只會複製這樣的降落傘類:

package { 

    import flash.display.MovieClip; 
    import flash.utils.Timer; 
    import flash.events.*; 
    import ascb.util.NumberUtilities; 
    import myGlobal; 
    import flash.geom.*; 
    import com.demonsters.debugger.MonsterDebugger; 


    public class paracaidistasClass extends MovieClip { 

     private var n:Number = 0; 
     private var _rotacionDelAvion:int = 1; 
     private var temporizador:Timer=new Timer(myGlobal.paracaidistasTemporizador[myGlobal.nivel - 1],0); 


     public function paracaidistasClass() { 
     // constructor code 
     temporizador.start(); 
     temporizador.addEventListener(TimerEvent.TIMER, emisor); 
     addEventListener(Event.ENTER_FRAME, altura); 
     } 

     private function altura(e:Event):void{ 
     if (myGlobal.detener == false){ 
      this.y = this.y - myGlobal.altura; 
     } 
     } 

     private function emisor(e:TimerEvent){ 
      if (myGlobal.detener == false){ 
         temporizador.delay = NumberUtilities.random(myGlobal.paracaidistasMinimoDelay[myGlobal.nivel - 1], myGlobal.paracaidistasMaximoDelay[myGlobal.nivel - 1]); 
         var paracaidista = new paracaidistaClass; 
         this.addChildAt(paracaidista, 0); 
         paracaidista.y = NumberUtilities.random(-350,50); 
         myGlobal.cantidadDeParacaidistas = this.numChildren; 
         addEventListener(Event.ENTER_FRAME, movimiento); 
      } 
     } 

     private function movimiento(event:Event):void{ 
if (myGlobal.detener == false){ 
       for (var i:Number=0; i<this.numChildren;i++){ 
        getChildAt(i).x = getChildAt(i).x - (myGlobal.velocidad - (pasarAPositivo(myGlobal.rotationDelAvion)/12)); 
        getChildAt(i).x = getChildAt(i).x - 1; 
        if (getChildAt(i).localToGlobal(new Point(stage.x,0)).x < -200){ 
         removeChildAt(i); 
         myGlobal.cantidadDeParacaidistas = this.numChildren; 
        } 
       } 
} 
//delete all parachutes 
     if (myGlobal.reiniciar == true){ 
      for (var d:Number=0; d<this.numChildren;d++){ 
         removeChildAt(d); 
         myGlobal.cantidadDeParacaidistas = this.numChildren; 
      } 
     } 
     } 

     private function pasarAPositivo(value:int):int{ 
      var _rotacionPositiva:int; 
      _rotacionPositiva = value; 
      if (_rotacionPositiva < 0){ 
       _rotacionPositiva = _rotacionPositiva * -1; 
      } 
      return _rotacionPositiva; 
     } 

    } 

} 

好吧。你可以看到我刪除了不在舞臺上或降落的降落傘,因此內存使用應該穩定在某些點上。我也檢查,我從來沒有通過降落傘的3,4個孩子。所以,我不明白爲什麼只有當y刪除整個級別的內存下降,以及爲什麼它不穩定,並保持增長時,當我刪除我不使用的孩子。我希望你已經清楚了,並且有人知道這個問題是什麼。提前致謝。

回答

2

不確定emisor Timer回調中到底發生了什麼,但是每次滿足條件時都添加一個eventListener。如果它是每個降落傘的一個,那麼你不會在任何地方移除該eventListener。你真的只需要一個ENTER_FRAME eventListener爲整個應用程序,只需要更新子類。

+1

是的,這看起來像是怎麼回事。他們多次添加相同的事件監聽器,以便函數每次運行多次(隨着時間的推移,這個數字變得相當大,我打賭)。要麼只添加一次,要麼在處理程序的第一行刪除它。問題應該解決。 –

+0

他提到,這是幾個類似的課程之一 - 毫無疑問事情會增加。 – Gone3d

+0

我解決了這個問題,性能稍微好一些,但我仍然有問題。我猜測可能是什麼問題,並且我認爲它與事件監聽器有關,這要感謝您指出我的代碼。我有個問題;當我刪除在其構造函數中添加事件偵聽器的類的子項時,事件偵聽器隨着子項消失或停留? –