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]