誕生背景
Adobe的Flash編譯器(ASC, ActionScript Compiler)表現得實在太「昨天」了,加上Flash虛擬機在效能上還有很大的提升空間,Flash很多時候被當做玩具或被戲稱為CPU hog。一般來說,我們很少會手去工優化一個SWF,大多數情況下,它都能良好地運行,但是當一個SWF文件尺寸過大導致加載時間過長或者代碼執行時間過長導致幀頻過低時,我們就需要考慮對SWF進行最佳化了,例如程式碼的精簡,靜態資源(圖片、影片等)的壓縮。但是手動優化產生的性能提升很是有限,更多的優化任務本應該交給編譯器來完成的,值得感激的是, Apparat框架可以幫助我們從手動優化的噩夢中解脫出來,不僅如此,任何未經過優化的SWF都能從中得到最佳化。 Apparat的作者joa ebert在Flash性能優化領域有深刻見解,今年的FlashAndTheCity大會上,joa的出色工作為他贏得了“2010年最天才的Flash開發者”和“2010年最傑出的貢獻者”兩項大獎。
建構環境
Apparat框架透過Scale寫成,在實踐它之前,需要先安裝Scala 2.8.0,Java 1.6,另外7-zip的安裝是可選的。建置好這些基本的運作環境後(需要加入PATH環境變數),從Google Code可下載最新的安裝套件(目前是1.0RC8)。下載後解壓縮到新的資料夾,其中包含的檔案有:
Apparat提供了許多命令列工具,例如tdsi, stripper, reducer等等,還有一些非常特殊的ActionScript API(存在於SWC檔案中)。接下來我們來看看Apparat是如何為Flash提速的。
優化字節碼
Apparat的核心功能是TAAS(Three Address ActionScript Compiler),TAAS不會改變任何一行ActionScript,它僅是使用普通的優化技術就能獲得可觀的效能提升。有別於Adobe的編譯器ASC,Apparat是對編譯過的SWF和SWC檔進行分析,再組織和再組裝。
Flash虛擬機AVM中的字節碼是基於堆疊的,這種結構難以再被優化,Apparat把基於堆疊的字節碼先轉換成CFG(Control Flow Graph),然後再透過CFG轉換成無堆疊的TAC (Three Address Code)碼, 即TAAS(Three Address ActionScript)。
有了TAC/TAAS, 就可以根據編譯器優化技術對Flash的字節碼進行再度優化了,例如inline expansion , copy propagation , constant folding , dead code elimination等等。
Apparat提供了幾個有用的SWC文件,它們擁有更有效率的API,甚至包含了ActionScript還無法使用的Alchemy API。使用了這些API的SWF經過Apparat處理之後,執行效率要大幅提升,其原理是Apparat對對應的程式碼做了內聯(inline)最佳化。優化字節碼的命令格式為:
tdsi -i input.swf -o output.swf
來源:口碑網UED Team