AS3的改變

In actionscript, flash   October 25, 2005 - 11:48 am

AS3除了帶來全新的DOM外,另一個大革新就是 Event Model。

以往在AS1/2裏,處理事件的方式有百百種,但基本上就是:

Actionscript:
  1. btn.onRelease = function(){
  2.     //do something
  3. }

或是

Actionscript:
  1. Mouse.addListener(someListener);
  2. function someListener(){
  3.      //do...
  4. }

而使用V2 components時,處理方式又變成

Actionscript:
  1. btn.addEventListener("click", doClick);

這些不一致性往往讓新手倍感頭痛(好吧,其實老手才更是咬牙切齒...)不知標準在那。

從AS3開始,flash的世界將只有一種Event Model,也就是V2 元件用的那種,而為了慣徹這種設計理念,整個Actionscript Class的架構都做了大改變,我們可以從下面的class tree看出來。

Object
|
+--flash.events.EventDispatcher
|
+--flash.display.DisplayObject
|
+--flash.display.InteractiveObject
|
+--flash.display.DisplayObjectContainer
|
+--flash.display.Sprite
|
+--flash.display.MovieClip

在這個架構的最上層是Object(是的,這代表下次你不知該如何cast一個物件時,仍然有個萬靈丹可惡搞,但當然這樣做要付出許多代價),下一個就是 EventDispatcher,這代表者flash裏幾乎每個物件都俱備了 dispatchEvent()的能力,因此自然也都可以用 addEventListener()來偵聽事件。

這也是為何在 flash.events.* 裏面新增了快一百多種event type 與 event class,真可說是處處是event、何處不廣播啊~

既然放了這張圖,可以順便看一下這顆樹的前面幾層,前文中提到的 Display Object與 DisplayObjectContanier都在很前面的位置,因此它們的重要性就不言可喻,此外InteractiveObject也是個重要的東西,它負責一切 Mouse, Keyboard、IME等裝置的動作偵測與廣播,從它所在的位置就可看出這次mm真的是很用心在重新設計整個架構。

AS3其它幾個重大的改變快速整理如下:

*runtime type checking + JIT compiled bytecode:

AS2之前flash只有 compiler time check, 因此許多runtime做的 type casting如果發生錯誤是沒辦法被抓出來的,只能靠自已一次次的 debug並trace每個物件來瞭解程式執行時記憶體的狀態,但現在加入了 runtime type checking後事情就變的很不一樣。

每次在 eclipse裏debug 時,只要一出現 casting error,eclipse會立刻跳到那一段並說明那裏錯誤,我故意試了幾個轉手casting的dirty trick想騙過它結果沒一個成功。

至於JIT的好處主要是在 byte code 與 native code之間的轉換,前者有體積小、可攜性高與安全的優點,但是執行效率慢(非常慢,看看JVM 1.1時的表現即知,或拿 FP7 與 FP8.5比較看看也可以),後者最主要的優點就是「快」,快到像 C++一樣的神速,這次 FP8.5全面採用 JIT bytecode後,執行效率的進步已經快到讓人驚訝(一般常見的測速結果都有 10x - 15x左右的差距)。

*32k 魔咒退卻:

以往一個class最大只能有32k, 這讓許多人得不停的把原本好好的一支class給分裂出去,才能降到 32k以下,而AS3則一口氣把這個limit拉高到 8mb,yes, 這應該是一個你永遠也沒辦法達到的上限才對,如果你能達到,代表你該把 design pattern的書拿出來再好好k一遍 Facade 跟 delegate 這兩章....(呃 Abstract Factory 跟 Command其實也要看一下)

*binary socket:

這是一個非常有趣的功能,FP8.5可以直接透過socket與各種socket server連線,最常見的socket 應用就是 email, 例如可以用 flash 寫一個 native的 pop3/smtp mail client,或是夠熱血的話可以連 NNTP, IMAP, IRC, SSH等各種應用都寫起來,目前我正在試者寫一個 pop3 client,直接透過 port 110 跟 pop3 server交談並操作,雖然對 socket programming還不是很熟悉,但仍然覺得很有趣啊~

另外伴隨 binary socket而來的就是 byteArray,這個array可以儲存 binary的資料,一般是透過socket傳回來的資料,但有趣的是它提供了一個 zlib壓縮功能,只要用:

Actionscript:
  1. ByteArray.compress();

就可以使用FP內建的 zlib 將資料壓縮,然後透過 socket傳出去,更棒的是,還記得 Flash 8裏最引人注目的 Image API嗎?現在只要透過 ByteArray.readXXX()的一系列操作,就可以將Image Data讀入 ByteArray, 然後壓縮後傳回 server,這不正是許多人夢眛以求的圖片/video上傳功能嗎?(ticore你不用再試 lzw 跟 php壓縮了,開始用 byteArray + socket才是王道啊...)

*mx.collection.*:

這個 package裏提供了兩個重要的資料結構,一個是 ICollectionView,另一個是 IList,它們將是未來AS3裏最主流的兩種資料結構(當然 Array的重要性仍然是排第一的啦),而在這裏面最重要的實作就是 ArrayCollection,簡單來講,它就是 RecordSet的繼任人選,對使用 flash remoting的人來說,recordset的重要性與必要性應該不用再解釋吧?現在既然AS3已把 recordset完全拿掉而且也不會再支援,應該是開始學ArrayCollection的時後囉~

*AMF3:

AMF(Action Media Format)是flash remoting, flashcom, local connection三者共用的 binary format,主要用來傳遞native flash object 並提供高度壓縮與自動編/解碼的功能,之前AS2使用的現在統稱為 AMF0,而AMF3自然就是專給AS3使用。

它主要的改良是在運作模式與編碼方式上,變的更有效率而且更聰明,因此可以大幅減少redundant data,這代表者傳輸速度會更快,同時應用範圍也會更廣,而且種種跡象顯示mm似乎有開放這個規格的傾向(例如在手冊中就提到 binary socket 的用途之一是透過它傳遞AMF object)。

但由於 FP8.5還在alpha階段,因此 remoting adptor這段只能靠最原始的 NetConnection自已去手動製作,當初為了成功連回 AMFPHP,可是廢了好大一翻功夫把整個 NetService, Service class都翻完才搞定,這真是回味無窮的經驗吶 -_-"

*e4x:

好吧,這個實在已經是舊聞中的舊聞了,AS3正式支援 ECMAScript For XML,you can dot down the xml document, period.

不過目前E4X 真的還在alpha的階段,執行效率只能用慘不忍睹來形容,比自已寫的 XPath還要慢,所以現在還不用期待太深。

(待續)

by admin

留言回應

hidden

您的留言會先經過站長認証後才刊登在網站上。
your comments will be approved by Administrator before appearing on the page.

Trackback this post  |  Subscribe to the comments via RSS Feed

mobile phone