用Apparat架构优化复杂Flash文件

本文探讨了Adobe Flash性能优化的问题,介绍了手动优化的局限性,并着重介绍了Apparat架构如何帮助解决这些问题。通过深入解析Apparat的核心功能,如字节码优化、去除debug信息、压缩SWF等功能,本文展示了如何利用Apparat提高Flash应用的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 http://design.yesky.com/flash/228/11825228.shtml

部分Flash的设计和开发者认为Adobe的Flash编译器(ASC, ActionScript Compiler)表现已经有些落伍了,加上Flash虚拟机在性能上还有很大的提升空间,Flash很多时候被戏称为CPUhog。一般来说,大多数情况下swf文件都能良好地运行,所以我们很少会手去工优化一个SWF文件。但是当一个SWF文件尺寸过大导致加载时间过长或者代码执行时间过长导致帧频过低时,我们就需要考虑对SWF进行优化了,例如代码的精简、压缩静态资源(图片、视频等)等。但是手动优化产生的性能提升很是有限,更多的优化任务本应该交给编译器来完成的。

  值得庆幸的是,Apparat架构可以帮助我们从swf文件手动优化的噩梦中解脱出来,它可以高效地优化ABC、SWC和SWF文件。

用Apparat架构优化复杂Flash文件 - cruelchen - 请重启您的计算........

  Apparat的作者joa ebert在Flash性能优化领域有深刻见解,在2010年的Flash And The City大会上,joa的出色工作为他赢得了“2010年最天才的Flash开发者”和“2010年最杰出的贡献者”两项大奖。

  下面我们来粗浅地了解一下Apparat架构的搭建环境以及常用的优化命令。

  Apparat架构搭建环境

  Apparat框架通过Scale写成,在实践它之前,需要先安装Scala 2.8.0,Java 1.6,另外7-zip的安装是可选的。搭建好这些基本的运行环境后(需要加入到PATH环境变量中),从Google Code可下载最新的安装包(目前是1.0RC9)。

用Apparat架构优化大体积Flash动画
Google Code中的Apparat

用Apparat架构优化大体积Flash动画
从Google Code可下载最新安装包

  下载后解压到新的文件夹,其中包含的文件有:

  Apparat提供了很多命令行工具,比如tdsi, stripper, reducer等等,还有一些非常特殊的ActionScript API(存在于SWC文件中)。

  接下来我们来看看Apparat是如何为Flash提速的。

  优化字节码(tdsi)

  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)

  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)

  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上(还在完善当中)。

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值