加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flash AS3 垃圾回收机强制执行(强烈推荐)

发布时间:2020-12-15 06:43:17 所属栏目:百科 来源:网络整理
导读:这是本人强烈推荐的释放内存方法! 具体测试: 分别用initNoBitmapDataView()和initBitmapDataView()进行10k个举行元素创建 测试结果: 1.1不使用BitmapData? ?内存占用 40M 2.1使用BitmapData? ???依旧内存占用?? 40M! 原因分析: 虽然_sqrList被设为null

这是本人强烈推荐的释放内存方法!

具体测试:


分别用initNoBitmapDataView()和initBitmapDataView()进行10k个举行元素创建


测试结果:

1.1不使用BitmapData? ?内存占用 40M

2.1使用BitmapData? ???依旧内存占用??
40M!
原因分析: 虽然_sqrList被设为null,但是原先被_sqrList所引用的1w个sprite数据依旧在内存中存在,虽然AMV2自带垃圾回收机,但是何时进行垃圾回收是不确定的。而要强制执行垃圾回收机,则要用上文提到的hack手段

2.2使用BitmapData + 垃圾回收hack? ? 内存占用? ?12M

package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.net.LocalConnection;

	public class MoonSpirit extends Sprite {
		private const SQR_AMOUNT:int=10000;//方块数量        
		private var _container_sp:Sprite;//容器sprite
		private var _sqrList:Array;//所有方块的引用

		public function MoonSpirit() {
			init();
		}

		private function init():void {
			_container_sp=new Sprite  ;
			addChild(_container_sp);
			//initNoBitmapDataView( );
			initBitmapDataView();
		}

		//初始化 通过通常手段 显示
		private function initNoBitmapDataView():void {
			layoutTenThousandSqr();
		}

		//初始化 通过BitmapData快照 显示
		private function initBitmapDataView():void {
			layoutTenThousandSqr();
			var myBitmapDataObject:BitmapData=new BitmapData(150,150,false,0xFF0000);
			var myImage:Bitmap=new Bitmap(myBitmapDataObject);
			addChild(myImage);
			unLayoutTenThousandSqr();
			_sqrList=null;
			doClearance();
		}

		private function layoutTenThousandSqr():void {
			_sqrList=new Array  ;
			for (var i:int=0; i<SQR_AMOUNT; i++) {
				_sqrList.push(new Sprite  );
				_sqrList[i].graphics.beginFill(0xff0000);
				_sqrList[i].graphics.drawRect(0,100,100);
				_sqrList[i].graphics.endFill();
				_container_sp.addChild(_sqrList[i]);
			}
		}

		//不显示
		private function unLayoutTenThousandSqr():void {
			for (var i:int=0; i<SQR_AMOUNT; i++) {
				_container_sp.removeChild(_sqrList[i]);
				delete _sqrList[i];
			}
		}

		//精髓,垃圾回收机强制调用
		private function doClearance():void {
			trace("clear");
			try {
				new LocalConnection  .connect("foo");
				new LocalConnection  .connect("foo");
			} catch (error:Error) {

			}
		}
	}
}

下面给大家讲讲垃圾回收hack的核心原理,其实这并不是什么技术含量很高的做法,只不过这样做能变向地帮我们实现垃圾回收而已!
所谓的强制执行垃圾回收机,是指通过故意使swf在运行时出错,然后throw出错误,而同时通过catch error来继续运行swf文件。而垃圾回收机则会在swf抛出错误的时候,被强制执行一次,以清除内存中无效的数据占用,减少资源的消耗。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读