- 注册时间
- 2005-11-15
- 最后登录
- 2018-4-24
版主
  
- 积分
- 390
|
一般來說 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[i] );
- delete _arr[i];
- }
- _arr = null;
- }
-
- private function doHack():void {
- trace("doHack()");
- try {
- new LocalConnection().connect("foo");
- new LocalConnection().connect("foo");
- }catch (err:Error){
-
- }
- }
- }
- }
复制代码 |
|