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 }

 

posted @ 2013-05-29 14:36  斯玛特琦  阅读(348)  评论(0编辑  收藏  举报