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

本文介绍了如何在Flash应用中高效压缩XML、图片和对象文件,包括XML压缩成二进制数据以节省空间,图片压缩以减少加载时间,以及将XML和对象数据保存为文件的方法。同时,提供了将图片转换为SWF文件以进一步减小尺寸的建议。

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

压缩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/archive/2013/02/26/2934212.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值