2011-07-07 73 views
1

我有一個很大的精靈......我將它分成幾個小的功能波紋管。該功能很好,但我的.swf的內存使用量急劇增長。AS3/Flash BitmapData .draw內存泄漏

我在做什麼錯?

private function split_sprite(sp:Sprite,the_parrent:Sprite) { 


    var region:Rectangle = new Rectangle(); 
    region = sp.getBounds(the_parrent); 

    var w=region.width/10; 
    var h = region.height ; 

    for (var i=0;i<10;i++){ 
      //Build Matrix Transform 
      var mat:Matrix= new Matrix(1,0,0,1, 0-w*i, 0); 
      sp.transform.matrix = mat; 

      //Draw the bitmap 
     var temp:BitmapData = new BitmapData(w + 2 , h, true, 0x000000); 


      temp.draw(sp,mat); 

      //Attach the BitmapData to a Bitmap Instance 
      var myBitmap:Bitmap = new Bitmap(temp); 
      myBitmap.smoothing = true; 
      //Re apply an Inverse Matrix 
      mat = new Matrix(1,0,0,1, region.x, region.y); 
      myBitmap.transform.matrix = mat; 
      var spp=new Sprite(); 
      //spp.cacheAsBitmap=true; 
      spp.addChild(myBitmap); 
      spp.x=w*i; 
      the_parrent.addChild(spp); 


    } 



} 
+1

你能詳細說明內存使用量急劇增長嗎?將一堆位圖添加到舞臺上會增加內存佔用空間......泄漏意味着您將刪除它們,但內存不會被釋放。 –

+0

它使用30 MB到100+ MB。 以下是我想要做的事情:我正在開發一個遊戲,它具有相當寬的級別(9000+像素寬和1500+高),通過一系列點(頂點)生成關卡中的地形並填充一個帶有beginBitmapFill的模式。遊戲在我的i5處理器上工作正常,但是當我在較慢的計算機上運行它時,幀速率從27 fps下降到大約14-17fps。 我做了一些挖掘和測試,發現大地形導致這個問題....所以開始閱讀如何優化它。 – George

+0

我向父Sprite添加了一個scrollRect - 這改進了性能,並且我正在讀取關於緩存的位圖...但它有其侷限性...所以我決定拆分我的精靈,使其足夠小以便緩存。 有關如何完成此任務的任何建議?或者提高性能的任何其他建議。謝謝。 – George

回答

4

如果我沒記錯的話的BitmapData將永遠不會被垃圾收集 - 您創建了許多新的BMD的對象,但是當你跟他們做你必須調用myBitmapDataObject.dispose()後自己清理。我不知道這是否會有所幫助 - 關於這種內存泄露的性質,您沒有太多的細節 - 但這是一個需要考慮的地方。如果您沒有正確處理(),BitmapData對象可以快速消耗大量內存。

+0

我試過temp.dispose();從它創建一個位圖後(myBitmap:Bitmap = new Bitmap(temp);)但是這也破壞了位圖...對不起,我對AS3不是很有經驗。 – George

+0

哦,對不起,是的 - 那是當你完成特定的BitmapData對象時。不要在你還要使用它時進行處理 - 只是在你不再使用它時才進行處理。例如,如果你多次重新載入相同的圖像,那麼你將可能最終爲每個實例創建一個BitmapData對象,直到你丟棄()舊的實例等等。 – Myk

+1

這是錯誤的,如果BitmapData對象本身有資格進行垃圾回收(不參考),它會遲早被內存釋放。調用BitmapData.dispose()不是'必須的'。你可以調用它,如果你想立即釋放內存。 – enigmatoP