flash ios 加载图片序列内存过大的解决方法

研究发现,如果直接用loader加载图片,然后在用bitmap生成图片,内存占用巨大,如果图片多了,那么放到移动设备肯定就会直接泪奔。


如果用 urlloader 来加载图片,获取图片的2进制数据,保存起来,内存占用很小。 我加载了50张图片,大小为1024*576像素,发现内存

只用了30-40M,比保存bitmapdata小得很多很多,如果放在 移动端,那么这内存 还是可以接受的,除非你真的用1000张图片,这是你就得分布加载了······


那么如何读取呢,我们可以用loader的 loadbytes方法来读取,但是要注意一点,在移动端,必须添加一个loaderContext,

并且设置 loaderContext.allowLoadBytesCodeExecution = true; 才能在移动端加载bytes图片

 

方法一:用ByteArray把文件读取出来再加载

//文件对象
var
stream:FileStream = new FileStream(); stream.open(file, FileMode.READ); var bytes:ByteArray = new ByteArray; stream.readBytes(bytes, 0, stream.bytesAvailable); stream.close(); loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded); var loaderContext:LoaderContext = new LoaderContext();    loaderContext.allowLoadBytesCodeExecution = true; loader.loadBytes(bytes,loaderContext);

 

代码:

package {
    import flash.display.Bitmap;
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.filters.ConvolutionFilter;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLLoaderDataFormat;
    import flash.utils.ByteArray;
   
    public class Main extends Sprite{
        private var loader:URLLoader;
        public function Main():void{
            loadImage("image.jpg");
        }
        private function loadImage(_path:String ):void{
            loader = new URLLoader;
            loader.dataFormat=URLLoaderDataFormat.BINARY ;
            loader.addEventListener (Event.COMPLETE , onImageLoaded);
            loader.load(new URLRequest (_path));
        }
        private function onImageLoaded(e:Event):void {
            var _ba:ByteArray = e.target.data as ByteArray;
            var _l:Loader = new Loader;
                _l.contentLoaderInfo.addEventListener (Event.COMPLETE, onBytesLoaded);
                _l.loadBytes(_ba);
            //-------- 置空 -----------
            loader.removeEventListener (Event.COMPLETE , onImageLoaded);
            loader = null;
        }
                
       private function onBytesLoaded(e:Event):void 
            {
               var _bitmap:Bitmap = e.target.content as Bitmap;
                trace(_bitmap.width, _bitmap.height );
                 addChild (_bitmap );
            //
             e.target.loader.contentLoaderInfo.removeEventListener (Event.COMPLETE, onBytesLoaded);
         }                
    }
}

 

 

posted @ 2013-12-09 09:45  无名盗闪  阅读(336)  评论(0)    收藏  举报