幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4785|回复: 0

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

[复制链接]

86

主题

250

帖子

390

积分

版主

Rank: 7Rank: 7Rank: 7

积分
390
发表于 2009-12-9 10:47:25 | 显示全部楼层 |阅读模式
一般來說 Flash 垃圾回收機制是自動發生, 無法透過手動呼叫控制~

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

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

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



透過使用以下語法~ 記憶體就整個降了下來。
  1. try {
  2.     new LocalConnection().connect("foo");
  3.     new LocalConnection().connect("foo");
  4. }catch (err:Error){}
复制代码
其原理就是故意使 swf 在運行時出錯, 然後throw出錯誤,

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

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

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

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

至少這個方法是可行的。

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

http://code.google.com/p/mrdoob/wiki/stats
  1. package {
  2. import flash.display.Bitmap;
  3. import flash.display.BitmapData;
  4. import flash.display.Sprite;
  5. import flash.net.LocalConnection;
  6. import flash.utils.setTimeout;
  7. import net.hires.debug.Stats;
  8. public class HackDemo extends Sprite {
  9.   private const AMOUNT :int = 10000;  
  10.   private var _arr  :Array;
  11.   public function HackDemo(){   
  12.    
  13.    
  14.    createTenThousandObj();
  15.    
  16.    addChild(new Stats());
  17.    
  18.    
  19.    setTimeout( removeTenThousandObj , 1000);
  20.    //雖然物件已經被移除, 但memory還是佔了約 33。
  21.    
  22.    setTimeout( doHack , 1100);
  23.    //透過 Hack的手法, memory 就整個降下來了, 可以試著把上一行注解掉來做比較
  24.   }
  25.   
  26.   private function createTenThousandObj():void {
  27.    _arr = [];
  28.    for (var i:int = 0; i < AMOUNT; i++) {
  29.     var _mc:Sprite = addChild( new Sprite() ) as Sprite;
  30.     _mc.graphics.beginFill(0x00ff00);
  31.     _mc.graphics.drawRect(0, 0, 100, 100);
  32.     _mc.graphics.endFill();
  33.     _arr.push(_mc);
  34.    }
  35.   }
  36.   private function removeTenThousandObj():void {
  37.    for (var i:int = 0; i < AMOUNT; i++) {
  38.     removeChild( _arr[i] );
  39.     delete _arr[i];
  40.    }
  41.    _arr = null;
  42.   }
  43.   
  44.   private function doHack():void {
  45.    trace("doHack()");
  46.    try {
  47.     new LocalConnection().connect("foo");
  48.     new LocalConnection().connect("foo");
  49.    }catch (err:Error){
  50.    
  51.    }
  52.   }
  53. }
  54. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-28 21:48 , Processed in 0.020424 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表