貘良了 发表于 2009-12-9 10:47:25

Hack 手法強制執行垃圾回收~ 釋放記憶體(转自飞肯学院)

一般來說 Flash 垃圾回收機制是自動發生, 無法透過手動呼叫控制~

而我們若要強制啟用垃圾回收機, 則需要用一些非正規手段。

在這兒我們產生一萬個 Sprite ,並繪製色塊, 一秒鐘後, 將一萬個Sprite移除。

此時可以看到記憶體還是這麼的高。



透過使用以下語法~ 記憶體就整個降了下來。

try {
    new LocalConnection().connect("foo");
    new LocalConnection().connect("foo");
}catch (err:Error){}
其原理就是故意使 swf 在運行時出錯, 然後throw出錯誤,

而同時通過catch error來繼續運行swf文件

而垃圾回收機則會在swf拋出錯誤的時候, 被強制執行一次

以清除 flash 內無效的數值, 減少資源的消耗。

但不是所有的throw錯誤都會發生垃圾回收。

至少這個方法是可行的。

要檢測你的swf用了多少的記憶體量, 可以使用Mr.doob所所的Stats類別來做監控。

http://code.google.com/p/mrdoob/wiki/stats

package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.net.LocalConnection;
import flash.utils.setTimeout;
import net.hires.debug.Stats;
public class HackDemo extends Sprite {
private const AMOUNT :int = 10000;
private var _arr:Array;
public function HackDemo(){   
   
   
   createTenThousandObj();
   
   addChild(new Stats());
   
   
   setTimeout( removeTenThousandObj , 1000);
   //雖然物件已經被移除, 但memory還是佔了約 33。
   
   setTimeout( doHack , 1100);
   //透過 Hack的手法, memory 就整個降下來了, 可以試著把上一行注解掉來做比較
}

private function createTenThousandObj():void {
   _arr = [];
   for (var i:int = 0; i < AMOUNT; i++) {
    var _mc:Sprite = addChild( new Sprite() ) as Sprite;
    _mc.graphics.beginFill(0x00ff00);
    _mc.graphics.drawRect(0, 0, 100, 100);
    _mc.graphics.endFill();
    _arr.push(_mc);
   }
}
private function removeTenThousandObj():void {
   for (var i:int = 0; i < AMOUNT; i++) {
    removeChild( _arr );
    delete _arr;
   }
   _arr = null;
}

private function doHack():void {
   trace("doHack()");
   try {
    new LocalConnection().connect("foo");
    new LocalConnection().connect("foo");
   }catch (err:Error){
   
   }
}
}
}
页: [1]
查看完整版本: Hack 手法強制執行垃圾回收~ 釋放記憶體(转自飞肯学院)