`
qq123zhz
  • 浏览: 530813 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用Apparat框架优化你的Flash (好东西)

    博客分类:
  • Flex
阅读更多

诞生背景

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

去除debug信息

Stripper命令可以去除SWF中所有的debug信息,并且该移除方式是安全的,即不会产生side effect,比如代码:

trace("the next element is: " + iter.next());

经过Stripper之后会变成:

(iter.next());

Stipper的命令格式是:

stripper -i input.swf -o output.swf

压缩SWF

Reducer命令可以对嵌入在SWF中的PNG图片进行JPEG有损压缩,通常对PNG图片进行100%品质的JPEG压缩还能节省一定的文件存储空间。该命令中有参数-q可以来设置压缩质量,1.0表示最高的压缩品质,0.0表示最低的压缩品质。

reducer -i input.swf -o output.swf -q 0.8

如果Reducer通过环境变量能找到7-zip, Reducer将会利用7-zip做进一步的压缩,那么即使SWF中不包含图片我们也能从此命令中获得一些优化的余地,需要说明的是,目前此功能只能作用于SWF,对SWC文件无效。

Adobe使用Deflate压缩算法对SWF进行压缩,通过Reducer可以采用更先进的LZMA压缩算法,由于Flash Player不认识LZMA,所以经过LZMA压缩后的SWF被嵌入在另一个新的SWF中,新的SWF作为一个壳包含了原有的SWF以及一个运行时解码器,目前这个解码器大概在5KB左右。使用LZMA压缩也可以看做是做了(较弱的)代码混淆。

在使用Reducer命令时加上参数-l可以启用LZMA压缩:

reducer -i input.swf -o output.swf -l

除了压缩图片,Reducer还对代码进行了合并,当链接外部的SWC时,每一个ABC文件都拥有一个常量池,Reducer能把所有的常量池合并成一个,并且它还对常量进行了排序,这样频繁使用的常量会具有更小的开销。

经过我的测试与实践,使用Reducer过程中有几点需要注意:

  1. 使用JPEG压缩后的Flash可能在低版本的Flash Player上呈现异样的色调,所以压缩后需要在低版本的Flash Player上进行检测。
  2. 启用LZMA很难达到文件尺寸的进一步减少,通常是增加了5KB,而且经过LZMA压缩的SWF只能运行的Flash Player 10及其以上版本上。

其它

以上3个命令是主要是针对SWF,SWC做进一步的优化,包括程序执行时间的优化,图片尺寸的优化,SWF存储空间的优化,以及debug信息的清除。Apparat还包含其它一些有趣的功能,比如dump命令用来分析SWF中的标签以及输出UML图,jitb命令可以把SWF转换成Java字节码从而运行在JVM上(还在完善当中)。

 

原文:http://ued.koubei.com/?p=1296

<script id="finspector_js_injector" type="text/javascript"></script>

<script type="text/javascript"></script>

分享到:
评论

相关推荐

    apparat-1.0-RC9

    为了提升Flash内容的性能和效率,开发人员需要依赖于各种工具,其中Apparat 1.0 RC9便是一款专为优化Flash资源而设计的框架。 Apparat,全称为“Apparat Application Runtime”,是一个强大的框架,主要针对ABC...

    apparat, optmize ABC,SWC和SWF文件的框架.zip

    apparat, optmize ABC,SWC和SWF文件的框架 Apparathttp://apparat.googlecode.com/Apparat is a framework to work with ABC, SWC and SWF files. You can use

    apparat-lzma-encoder-1.0-RC9.jar

    java运行依赖jar包

    Apparat:基于 OpenFL 构建的 Haxe 中基于组件的游戏框架

    欢迎来到 Apparat——一个基于实体和组件的 haxe 游戏框架! Apparat 基于 OpenFL 构建,还包含大量样板代码,可让您专注于真正重要的事情——您的游戏! Apparat 基于实体和组件,非常容易扩展和重用。 特征: ...

    Apparat:C ++库-开源

    Apparat是面向Linux程序员的功能强大的C ++框架。 它提供了方便实用的功能,包括以下内容:高级智能指针(强弱句柄),容器集(数组,列表,映射,扇区,循环缓冲区,优先级队列),自己强大的信号/插槽机制(信号...

    apparat-log-1.0-RC9.jar

    java运行依赖jar包

    apparat-core-1.0-RC9.jar

    java运行依赖jar包

    apparat-maven-plugin-1.0-RC9.jar

    java运行依赖jar包

    AS3-DomainMemoryManager:Adobe AIRFlash中用于域内存访问的管理器

    以前的快速内存操作只能通过Adobe Alchemy(现在称为FlasCC,Flash / AIR应用程序的C / C ++交叉编译器)或通过外部字节码优化器(如Apparat或Azoth)或通过Haxe使用。 如果您对Flash中快速内存操作的历史感兴趣,...

    俄语电子计算机专业词汇.doc

    2. ноутбук (noutbuk) - 笔记本电脑:一种便携式的个人计算机,适合在移动环境中使用。 3. монитор (monitor) - 显示器:显示计算机输出图像的设备,有液晶显示器(жидкокристалличе...

Global site tag (gtag.js) - Google Analytics