zoukankan      html  css  js  c++  java
  • 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 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 }
  • 相关阅读:
    linux快速安装lamp环境
    linux配置网卡
    给linux添加yum源。
    windows 环境下wamp环境的搭建。
    jQuery知识点总结(第六天)
    LazyLoad学习(一)之无阻塞动态尽可能并行加载脚本文件以及确保执行顺序
    Jquery复习(十)之$的用法
    JavaScript 时间与日期处理
    如何将一个HTML页面嵌套在另一个页面中?
    iframe学习(七)之父窗口的样式会影响子窗口吗?
  • 原文地址:https://www.cnblogs.com/hisiqi/p/3105952.html
Copyright © 2011-2022 走看看