垃圾回收机强制执行[as hack技术]

 哈哈,
[url=http://www.actionscript3.cn/bbs/space-uid-39.html]Moonspirite[/url]
兄弟发的一篇好文,转载来跟大家分享。我稍稍做了一点调整。期待Moonspirite再出好文,呵呵。
保留原文出处链接和原帖的讨论:
[url=http://www.actionscript3.cn/bbs/thread-234-1-1.html][as hack技术]垃圾回收机强制执行[/url]
原文如下:
----------------------------------------------------------------------------------------
首先,要感谢校友学长“费gg”的帮助,提供了核心的hack技术的方法。
然后鉴于几天前一网友关于画上万个sprite之后内存增大问题,在此一并作一下讨论和解决。
-----------------------------------------------------------------------------------------
概述:AVM2理论上是自带垃圾回收机的,但是具体何时进行垃圾回收,理论上非人为所能控制,而我们若要强制启用垃圾回收机,则需要用一些非正规手段,比如如下会提到的手段。
关键字:垃圾回收
核心hack技术
批注:所谓强制执行垃圾回收机,是指通过故意使swf在运行时出错,然后throw出错误,而同时通过catch error来继续运行swf文件。而垃圾回收机则会在swf抛出错误的时候,被强制执行一次,以清除内存中无效的数据占用,减少资源的消耗。
我当初也是这么理解的,不过从“费gg”处所学到的,包括自己所测试的,并不是所有的error throw都能触发垃圾回收机,而也只局限于某些特定的error,而上文的例子中的这一error恰为其中的一种error类型。
try{
new LocalConnection().connect("MoonSpirit");
new LocalConnection().connect("MoonSpirit");
}catch(error : Error){ 
}
运行上述代码,可强制执行一次垃圾回收机。
 
具体测试:
分别用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
本文转自:http://www.5uflash.com/flashjiaocheng/Flashyingyongkaifa/1002.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值