2011年10月20日 星期四

PhoneGap OpenBeta

今天收到PhoneGap的新聞稿,主要還是說他們被Adobe買走的事情,另外就是Open Beta了!!!!
最近比較少去follow他們的更新進度,不過到了Open Beta應該也完成很多新功能了八= =??
要是要用PhoneGap開發手機App,我還是建議開發比較靜態的App,過於動態的App
可能會遇到效能瓶頸~Orz

補充:PhoneGap要收費了,不過開發者is Free!!!!

2011年10月5日 星期三

2011年10月4日 星期二

2011年9月27日 星期二

Flash GC,值得仔細閱讀

http://wiki.blueidea.com/index.php?title=FlashPlatform_GC

GC重點在於清除所有引用的Event跟清除不需要的Object,這樣可以讓GC自動幫我們清理
當你使用一個影片元件內含大量的png圖檔或是元件,你要release(釋放)它的時候,要記得清除乾淨
可以用這個方法:
this.addEventListener(Event.REMOVE_FROM_STAGE,releaseEvent);
當物件被移除的時候就會呼叫你自己設定的release 清除事件

ActionScript3的垃圾回收機制使用兩種方式。

1.reference count 如果一個對象的引用次數為0,那麼會自動回收。
2.mark and sweep 標記並清除,在DOM從root向下探詢並標記。如果有沒標記的則會自動清除
GC方式:
System.gc();

2011年8月26日 星期五

如何自動更新清除使用者的swf檔案

瀏覽器清快取檔案的觸發條件有以下:
1.使用者手動清除
 說明:使用者手動使用瀏覽器的選項做清除動作
 優點:
   1.可以保證ㄧ定清除乾淨!!!
 缺點:
   1.不是每位使用者都懂清快取的指令~Orz
2.網頁宣告不做暫存快取
 說明:在網頁META設定不做快取,每次都會重新讀取檔案
 優點:
   1.可以保證ㄧ定是最新的檔案
 缺點:
   1.每次都重新讀取,如果檔案過大,會造成很大的網路負載=  ="
 code:
  <meta http-equiv="expires" content="0" />
3.關閉瀏覽器
 說明:IE9預設關閉瀏覽器後自動清除快取
 優點:
   1.可以確認有某種程度快取檔案是被清除
 缺點:
   1.如果是舊版的或是不同的瀏覽器這個動作就不見得會發生
  
4.swf檔案連結跟本機的swf檔案的連結不同
 說明:快取的儲存方式是用連結去判斷,所以只要給新的連結,就會重新讀取
 優點:
   1.可以保證ㄧ定是最新的檔案
 缺點:
   1.只能對一個swf檔案有作用,除非每個swf檔案都用新連結去讀取
  
那我用什麼方法?答案是3跟4,因為IE9是沒有4的清快取機制,那我只要處理第4個答案的缺點 解法:
 1.網頁在讀取main.swf的時候,flash url位置設成main.swf?ver=檔案大小或是日期,這樣就會自動更新了
 2.如果讀取main.swf之後,還要再讀取其他的swf檔案要怎麼做? 
   flash有分成本機跟遠端安全沙箱模式,在本機沙箱中loader是不可以設置SecurityDomain.currentDomain做為連接遠端機制,會出現2142安全性違規
   所以我們可以要從目前的沙箱狀態去判斷說現在是本機還是遠端沙箱再來決定要不要在讀取swf的url加上更新連結的動作
  code:
  /*-------------------------------------------------------------
  宣告
  -------------------------------------------------------------*/
  private var appDomain:ApplicationDomain = ApplicationDomain.currentDomain;
 private var context:LoaderContext = new LoaderContext();
 private var loadMode:Boolean = false;//本機沙箱或是網路沙箱 true為本機 false為網路
 private var nowVer:String = '0001';
 private var loader:Loader;
 /*-------------------------------------------------------------
  Main
  -------------------------------------------------------------*/
  private function Main():void{
    setSecuityMode();
    loadSwf('a.swf');
  }
  /*-------------------------------------------------------------
  setSecuityMode
  設定安全沙箱旗標
  -------------------------------------------------------------*/
  private function setSecuityMode():void{
  context.applicationDomain = appDomain;   
  if(Security.sandboxType == Security.LOCAL_TRUSTED)
   loadMode = true;
  else if(Security.sandboxType == Security.REMOTE){
   loadMode = false;
   context.securityDomain = SecurityDomain.currentDomain;
  }
 }
 /*-------------------------------------------------------------
  loadSwf
  讀取swf檔案
  參數:_file:檔案名稱
  -------------------------------------------------------------*/
 private function loadSwf(_file:String):void{
  var url:String;//檔案位置
  if(!loadMode){
   //Url為HTTP才能使用帶參數的方式去讀取
   url = 'http://www.yourdomain.com/' + _file + '?ver=' + nowVer;
  }else
   //本機檔案,使用相對位置讀檔
   url =  _file;
  trace('the url:' + url);
  loader.load(new URLRequest(url), context);
 }
 
 

2011年8月24日 星期三

多個SWF設定字體為外部字體檔,導致重覆讀取字體檔的解決方式

 因為手上的專案需要使用中文字體,所以決定使用字體用匯入的方式處理,來節省讀取資料量,不過因為用匯入的方式,會去讀取外部字體檔,結果就是全部的swf檔都自己去讀字體檔了,導致loading過重~Orz
   讀取流程:
   1.main.swf 讀取完成
   2.main.swf讀取 Font.swf,並存到記憶體內
   3.讀取 a.swf檔案
   4.a.swf讀取 Font.swf,並存到全域字體內
   5.讀取 b.swf檔案
   6.讀取 c.swf檔案
  
  總共讀取資料量:
   1.main.swf 500k
   2.Font.swf 6000k
   3.a.swf 1000k
   4.Font.swf 6000k
   5.b.swf 1000k
   6.c.swf 500k  
   共計: 15000k
  
  
  上面讀取流程會變成Font.swf讀取2次,如果把step 2拿掉,會發生不知道字體檔的讀取進度的問題,這樣會造成無法在main檔內的讀取條中顯示讀取進度的問題
  
解決方式:
  1.在main.swf先用loader載入字體檔(font.swf),然後再載入共享用的字體資源分享檔(shareFont.swf)
  2.所有的swf的字體設定都設定為匯入字體檔並且把匯入的url設定為shareFont.swf
  3.shareFont.swf只做字體定義的動作,實際上還是由main.swf讀取字體檔,所以可以知道讀取進度
  /*---------------------------------------------------------------
  程式碼
  ---------------------------------------------------------------*/
  import flash.system.ApplicationDomain;
 import flash.text.Font;
 var appDomain:ApplicationDomain = ApplicationDomain.currentDomain; 
 if(appDomain.hasDefinition('ArialRegular')){
  var fc:Class = appDomain.getDefinition("ArialRegular") as Class;
  if(fc != null){
   trace('set font:ArialRegular');
   //字體定義
   Font.registerFont(fc);
  }
 }

  讀取流程:
  1.main.swf 讀取完成
  2.main.swf讀取 Font.swf,並存到記憶體內
  3.main.swf讀取 shareFont.swf,存到記憶體內,這樣shareFont.swf才能去使用Font.swf的字體並做定義
  4.main.swf讀取其他swf檔案,因為其他的swf檔案可以找到shareFont.swf的字體,所以就不會又去重新讀取
 
  總共讀取資料量:
   1.main.swf 500k
   2.Font.swf 6000k
   3.shareFont.swf 1k
   4.a.swf 1000k
   5.shareFont.swf 1k  
   5.b.swf 1000k
   6.c.swf 500k  
   共計: 9002k
 
  少讀了5998k~~!!!!
 
備註:中文字體檔是真的很大的,只帶5000中文字而已就有6M的實力了,所以不用想說要把字體檔瘦身~Orz