AcstionScript位图保存技术及相关内存优化

总结:加载了一个位图后,需要的最重要的信息就是获得了位图的BitmapData,为了不二次加载,这个数据一般是驻留在内存中的,对于较大的位图而言,这个内存占用会比较大。因此需要在不需要显示这些位图的时候,优化这些位图的内存占用。

本文的思路就是:在不显示位图的时候,将位图的BitmapData转换成ByteArray压缩后保存在内存中。下次需要显示位图时,解压ByteArray转换成BitmapData使用。

在页游中,我们可以将这种转换成二进制然后压缩后暂存的方法加以推广使用

除了较大的位图可以使用这种方法外,占内存比较多的独立模块也可以使用这种方式进行暂存。

====================================================================================================================

(转)好久没写部落阁啦,最近发现了一个比较有营养帖子,讨论的是加载位图后相关的内存优化问题,总结了下前辈们的经验,决定将这个技术应用到现在在写的一个翻页杂志中,我将这个技术命名为B&B(ByteArray&BitmapData)

As3载入图片后全部为Bitmap,要将Bitmap的内存释放掉我们需要用到bitmapData的dispose方法,但在释放掉内存之前要做一个步骤就是将BitmapData模式保存的位图信息以2进制(ByteArray)形式保存,这样就能大大的降低内存的消耗,理想情况下是载入图片以后如果不用马上转成ByteArray,然后将位图删掉,释放内存。等到要用了再利用 byteArray.writeObject(bitmapData.getVector())方法将位图读出来,同时用byteArray.clear()方法将ByteArray的内存释放掉。放代码

 1 package

 2 {

 3  import flash.display.Bitmap;

 4  import flash.display.BitmapData;

 5  import flash.display.Loader;

 6  import flash.display.Sprite;

 7  import flash.events.Event;

 8  import flash.events.MouseEvent;

 9  import flash.geom.Rectangle;

10  import flash.net.URLRequest;

11  import flash.utils.ByteArray;

12  

13  public class BTB extends Sprite

14  {

15   private var data:ByteArray;

16   private var urlload:Loader;

17   private var bool:Boolean=false;

18   private var transBool:Boolean=false;

19   private var bitData:BitmapData;

20   private var rect:Rectangle;

21   private var bitMap:Bitmap;

22   public function BTB()

23   {

24    this.init();

25   }

26   

27   private function init():void

28   {

29    stage.addEventListener(MouseEvent.CLICK,onClick);

30   }

31   

32   private function onClick(e:MouseEvent):void

33   {

34    if (bool==false){

35     //判断未加载

36     loadPic();

37     bool=true;

38    }else{

39     if (this.transBool){

40      this.data=this.bitData.getPixels(this.rect);

41      this.removeChild(this.bitMap);

42      this.bitMap=null;

43      this.bitData.dispose();

44      this.data.compress();

45      this.transBool=false;

46     }else{

47      this.bitData=new BitmapData(this.rect.width,this.rect.height);

48      this.data.uncompress();

49      this.data.position=0;

50      this.bitData.setPixels(this.rect,this.data);

51      this.data.clear();

52      this.bitMap=new Bitmap(this.bitData);

53      this.addChild(this.bitMap);

54      this.transBool=true;

55     }

56    }

57   }

58   

59   private function loadPic():void

60   {

61    var url:String="1.jpg";

62    var urlrequest:URLRequest=new URLRequest(url);

63    urlload=new Loader();

64    urlload.load(urlrequest);

65    urlload.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);

66   }

67   

68   private function onComplete(e:Event):void

69   {

70    var bitmap:Bitmap=e.target.content as Bitmap;

71    var width:Number=bitmap.width;

72    var height:Number=bitmap.height;

73    var bitmapData:BitmapData=bitmap.bitmapData;

74    this.rect=new Rectangle(0,0,width,height);

75    this.data=bitmapData.getPixels(rect);

76    bitmapData.dispose();

77    this.data.compress();

78    e.target.removeEventListener(Event.COMPLETE,onComplete);

79    trace ("complete");

80   }

81   

82   private function clean():void

83   {

84    this.urlload.unloadAndStop(true);

85    this.urlload=null;

86    trace ("gc");

87   }

88  }

89 }

 

你可能感兴趣的:(script)