2007年12月28日 星期五

Flex Embed SWF 與 Embed Symbol 的差異

Ticore's Blog

有人提出 Flex 嵌入的 SWF 無法被 BitmapData.draw 的問題
所以來測試看看
初步測試之後發現,只要在初始化之後稍等一下
就可以正常使用了

這是很典型初始化時間差的問題
於是進一步加入編譯參數 -keep-generated-actionscript=true 測試
觀察 Flex 產生的中間 ActionScript 程式碼

Flex Embed 範例 Main.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
 <mx:Script>
  <![CDATA[
  
   [Embed(source="../assets/assets.swf")]
   public var swf:Class;
  
   [Embed(source="../assets/assets.swf", symbol="MC")]
   public var mc:Class;
   
  ]]>
 </mx:Script>
</mx:Application>

將上述的範例加入 -keep-generated-actionscript=true 參數編譯之後
可以在產生的 ActionScript 檔案中找到三個與 Embed 動作相關的 AS Class
Main_mc.as、Main_swf.as、Main_swf_dataClass.as

Main_mc.as:

package {
 import mx.core.SpriteAsset;
 
 [ExcludeClass]
 [Embed(_resolvedSource="D:/Workspaces/WorkspaceFlex30/Flex3Test06/assets/assets.swf",
  _column="5", symbol="MC", source="../assets/assets.swf", _line="108", _pathsep="true",
  _file="D:/Workspaces/WorkspaceFlex30/Flex3Test06/src/generated/Main-generated.as")]

 public class Main_mc extends mx.core.SpriteAsset {
     public function Main_mc() { 
      super();
     }
 }
}

Main_swf.as:

package {
 import mx.core.MovieClipLoaderAsset;
 import flash.utils.ByteArray;
 
 public class Main_swf extends MovieClipLoaderAsset {
  public function Main_swf() {
   super();
   initialWidth=6000/20;
   initialHeight=4000/20;
  }
  private static var bytes:ByteArray = null;
 
  override public function get movieClipData():ByteArray {
   if (bytes == null) {
    bytes = ByteArray( new dataClass() );
   }
   return bytes;
  }
  [Embed(_resolvedSource='D:/Workspaces/WorkspaceFlex30/Flex3Test06/assets/assets.swf',
   mimeType='application/octet-stream')]
  public var dataClass:Class;
 }
}

Main_swf_dataClass.as:

package {
 import mx.core.ByteArrayAsset;
 
 [ExcludeClass]
 [Embed(_resolvedSource="D:/Workspaces/WorkspaceFlex30/Flex3Test06/assets/assets.swf",
  _column="3", exportSymbol="Main_swf_dataClass", _line="25", _file="Main_swf.as",
  mimeType="application/octet-stream")]
 
 public class Main_swf_dataClass extends mx.core.ByteArrayAsset {
     public function Main_swf_dataClass() { 
      super(); 
     }
 }
}

由產生的程式碼來看,直接 Embed Symbol 並無特別之處
可是 Embed SWF 檔案,就不太一樣了
Flex 編譯器會自動將整個 SWF 檔案以 Binary 方式嵌入
執行期使用的時候,最終也是透過 Loader.loadBytes 方式還原
這樣的話,一定會有時間差
無法在剛 new 完之後立刻取用

除了上述的問題以外
透過 Loader.loadBytes 產生的實體
還有一些安全性的限制

此外,嵌入整個 SWF 也會增加無謂的檔案容量
所以最好還是不要將整個 SWF 嵌入比較好

最後補充一點,嵌入整個 SWF 會保留 ActionScript
而嵌入 Symbol 的 ActionScript 不會保留

0 意見 :