诞生背景
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