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 }