zoukankan      html  css  js  c++  java
  • 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文件进行使用,这样尺寸会小一些。

  • 相关阅读:
    后期生成事件命令copy /y
    SevenZipShaper压缩类
    vs2017
    WCF路由服务
    微服务--
    各种流程图的绘画网路工具 processon
    ROC 准确率,召回率 F-measure理解(转载)
    Unix OpenCV安装
    转载:tar 解压缩命令~
    cppreference经验总结
  • 原文地址:https://www.cnblogs.com/xinqingHappy/p/2934212.html
Copyright © 2011-2022 走看看