flash的强制垃圾回收 flash内存释放

博客探讨了在Flash中如何进行强制垃圾回收以释放内存,尤其是处理图像资源时的问题。通过使用特定的代码段,可以触发垃圾回收机,从而减少内存占用。测试显示,使用BitmapData并配合垃圾回收技巧可以显著降低内存消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

搞了个 图片循环滚动的效果 内存 忽高忽低  但是 该释放的资源 也都释放了 很奇怪 
查了下 flash 垃圾回收  原来 flash 每隔 一段时间  回收 一次 垃圾 释放 内存 而 对于 图像 的资源 直接 delete
null 掉 并 没有释放 
需要强制 回收  当然 也是要付出代价 cpu 

剩下的就是转




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

/

概述:AVM2理论上是自带垃圾回收机的,但是具体何时进行垃圾回收,理论上非人为所能控制,而我们若要强制启用垃圾回收机,则需要用一些非正规手段,比如如下会提到的手段。

关键字:垃圾回收

核心hack技术
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 < SQR_AMOUNT; i++){
                                _sqrList.push(new Sprite());
                                _sqrList[i].graphics.beginFill(0xff0000);
                                _sqrList[i].graphics.drawRect(0,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){
                                
                        }                        
                }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值