压缩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文件进行使用,这样尺寸会小一些。