Flash应用效率优化资源压缩篇

压缩XML
     XML是Flash中经常用到的数据提供源,那么当我们的游戏或者应用越来越大时,XML配置文件也会跟着变大,这将会占用我们很多的加载时间。那么你可能不知道我们可以把XML文件压缩成二进制数据然后保存起来,这样将会为你节省50%(保守估计)以上的空间。

        经研究发现,如果不直接保存XML数据,而是将XML压缩成二进制数据再保存的话,保存得到的文件体积会小得多。通过以下的代码可以将一个XML数据转换成二进制数据:

1.var data:ByteArray = new ByteArray();
2.data.writeUTFBytes(xmlData);
3.data.compress();

通过将XML对象写入一个ByteArray中,之后调用ByteArray.compress方法可以将数据进行压缩。执行完这步后就可以将此 ByteArray对象作为FileReference.save方法或者FileStream.writeObject方法的参数进行文件保存了。

        列位可以通过我提供的XML压缩工具来进行快速压缩XML文件的工作,也可以浏览该工具的源码来获知压缩及保存XML文件的原理(工具下载地址:http://www.iamsevent.com/UPLOAD/AS3Optimize/XMLCompressTool.rar

        在加载完毕被压缩的XML文件时,别忘了解压缩,否则无法得到我们保存的XML数据:

01.var ldr:URLLoader        = new URLLoader();
02.ldr.dataFormat        = URLLoaderDataFormat.BINARY; // 必须设置dataFormat
03.ldr.addEventListener(Event.COMPLETE, on_XML);
04.ldr.load(new URLRequest(pathToXMLFile));
05. 
06.var xmlData:XML;
07. 
08.function on_XML(evt:Event):void
09.{
10.var data:* = URLLoader(evt.target).data;
11.if (data is ByteArray)
12.{
13.try
14.{
15.ByteArray(data).uncompress();
16.}
17.catch(e:Error)
18.{
19.}
20.}
21.xmlData = XML(data);
22.}

这种压缩方式对于存在着大量重复标签名的XML能获得超高的压缩率,比如这样子的一个XML:

1.<TextureAtlas imagePath="Actor1.png">
2.<SubTexture name="0_0" x="0" y="0" width="32" height="32" />
3.<SubTexture name="0_1" x="32" y="0" width="32" height="32" />
4.(此处省略70条……)
5.</TextureAtlas>

由于子标签的标签名、属性名都一样,所以压缩后,XML文件尺寸能从6.24KB缩减到518字节,压缩了92%的尺寸!!

保存Object对象文件

        Flash应用的数据提供源往往是xml文件,但是在很多项目中也会使用对象文件。何谓对象文件呢?就是直接把AS3中的一个Object对象数据保存成文件保存起来。假设存在以下一个XML文件:

1.<root>
2.<e n="p0" v="0" />
3.<e n="p1" v="1" />
4.(省略997条……)
5.</root>

这样子一个文件的尺寸大概是23K左右。那么我们接下来就准备将它保存为Object文件。直接保存Object对象也需要借助ByteArray爱将的威力!

1.var obj:Object = {};
2.for(var i:int=0; i<1000; i++)
3.{
4.obj["p" + i] = i;
5.}
6.byteArr = new ByteArray();
7.byteArr.writeObject(obj);<br>

我们将XML中每个子标签的n属性作为属性键,v属性作为属性值保存在一个Object对象中,之后,将该Object对象写入到一个 ByteArray中,最后便可以像之前说的那样,把byteArr对象作为FileReference.save方法或者 FileStream.writeObject方法的参数保存为文件了,保存的文件可以是任何自定义的后缀名,因为它们不能被直接打开,而只能被 Flash加载并作为对象读出。下面的代码演示了加载对象文件并作为对象读出的过程:

01.var urlLoader:URLLoader = new URLLoader();
02.urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
03.urlLoader.addEventListener(Event.COMPLETE, onComp);
04.urlLoader.load(new URLRequest("ObjectFile.obj"));
05. 
06.function onComp( e:Event ):void
07.{
08.var byte:ByteArray = ByteArray( (e.currentTarget as URLLoader).data );
09.var obj:Object = byte.readObject();
10.}

千万别忘了将URLLoader.dataFormat设为URLLoaderDataFormat.BINARY哦!这样子便可以按预期得到所需 数据,且我们直接就可以拿到一个Object对象,它肯定比一个XML对象要便于使用。将之前那个XML文件转换为Object对象后,文件尺寸由23K 缩减到了7K左右,压缩比率虽然不如之前那种方式,但也有很多项目组会选择这种方式,因为它一被加载好就可以直接使用得到的Object对象而不需要进行 什么额外的格式转换,用起来很方便~

 压缩图片

     图 片是我们最常用的资源了。在flash里最常用的图片格式是.jpg和.png,对于png格式的图片是保留了透明通道的图片,所以一般来说它的尺寸会比 jpg大,所以在没有用上透明层的条件下尽量使用jpg格式,即使用上了png格式你也可以根据使用需要选择png图片压缩的类型(png8, png24, png32)。

        而在使用jpg格式图片的时候你也可以简单地压缩jpg图片的品质,一般来说80%品质看起来和100%的品质差别不会很大,而尺 寸则会大大削减。你可以使用ACDSee等图片浏览软件来直接转换图片的品质,也可以在Flash CS Professional软件的“发布设置”中调整发布的swf中使用图片的品质。

        另外,最好让美术同事直接在Flash CS Professional软件中绘图,这样就不需要把位图导入到库中了,同样一个图形,做成图片后导入到fla库中和直接在fla元件中绘图这两种方式得到的swf文件尺寸会有所差别。

用swf存放所有素材
        swf文件本身就是一种压缩过的产物,你可以在flashCS工具中将所有素材放入库中然后将这些素材都导出为ActionScript 后,外部加载完毕此swf后就可以使用了。编译后库中的所有资源,不论是图片,xml,声音还是其他任何东西都将被压缩为二进制数据,大大削减素材总尺 寸。在下一章中我将告诉大家如何最大限度地使用外部加载进swf中的资源。

        很多项目中不会直接使用.png或者.jpg这样的图片格式,而会把图片都转换成.swf文件进行使用,这样尺寸会小一些。

原文地址:https://www.cnblogs.com/xinqingHappy/p/2934212.html