AS3的改變
AS3除了帶來全新的DOM外,另一個大革新就是 Event Model。
以往在AS1/2裏,處理事件的方式有百百種,但基本上就是:
-
btn.onRelease = function(){
-
//do something
-
}
或是
-
Mouse.addListener(someListener);
-
function someListener(){
-
//do...
-
}
而使用V2 components時,處理方式又變成
-
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壓縮功能,只要用:
-
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還要慢,所以現在還不用期待太深。
(待續)


Trackback this post | Subscribe to the comments via RSS Feed