一起來說 Flash 垃圾回收機制是自動發生, 無法透過手動呼叫控制, 而我們若要強制啟用垃圾回收機, 則需要用一些非正規手段。
在這兒我們產生一萬個 Sprite ,並繪製色塊, 一秒鐘後, 將一萬個Sprite移除。
此時可以看到記憶體還是這麼的高。
透過使用
記憶體就整個降了下來。
其原理就是故意使 swf 在運行時出錯, 然後throw出錯誤,
而同時通過catch error來繼續運行swf文件
而垃圾回收機則會在swf拋出錯誤的時候, 被強制執行一次
以清除 flash 內無效的數值, 減少資源的消耗。
但不是所有的throw錯誤都會發生垃圾回收。
至少這個方法是可行的。
要檢測你的swf用了多少的記憶體量, 可以使用Mr.doob所所的Stats類別來做監控。
http://code.google.com/p/mrdoob/wiki/stats
在這兒我們產生一萬個 Sprite ,並繪製色塊, 一秒鐘後, 將一萬個Sprite移除。
此時可以看到記憶體還是這麼的高。
透過使用
try { new LocalConnection().connect("milkmidi"); new LocalConnection().connect("milkmidi"); }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[i] ); delete _arr[i]; } _arr = null; } private function doHack():void { trace("doHack()"); try { new LocalConnection().connect("foo"); new LocalConnection().connect("foo"); }catch (err:Error){ } } } }
留言