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

沒有留言:

張貼留言