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


    概述: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){
                                    
                            }                        
                    }
            }
    }
  • 相关阅读:
    Gitlab 自带Nginx与原Nginx冲突的解决方案
    宝塔PHP7.3版本安装ZIP扩展
    GitLab配置ssh key
    Git Windows打分支 并推送到远程
    proj4 coordinates must be finite numbers
    uniapp APP端水印相机实现
    uniapp使用逆地理编码
    uniapp sqlite数据库使用
    uniapp APP 定位获取
    uniapp打包流程
  • 原文地址:https://www.cnblogs.com/top5/p/2447778.html
Copyright © 2020-2023  润新知