2011-07-07 46 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