android游戏资源优化

2013-10-27

我的游戏apk包的大小增加到36M了,而且加载速度也奇慢无比。没办法,不得不做资源优化了。下面是记录下这些点点滴滴。

优化的内容

其实主要就是三个方面: 1. 最终的发布包大小 2. 加载速度 3. texture资源的大小

公司对包的大小要求极为严格,必须做到支持低端市场,比如同样游戏,别人做出来30M,我们则一定要压到10M才允许发布。这方面的优化主要就是.9图和降低素材采样率了。

加载速度方面,我现在是所有东西都全部在进游戏时一口气加载完毕的,后面要改成分段加载。

texture资源大多,显存不够的机器上,容易出现白屏。同事的经验是,小Y最多支持7张1024。

优化前分析

我分析了一下目前的资源。

.........

接下来就是优化了。

素材压缩

这方面做的主要工作是,去除冗余,音频压缩,合理使用.9,各种图片资源的格式选择等等。

首先拿掉了没有用到的素材。然后把几个背景图直接压缩了,游戏中再进行拉伸,这个会有锯齿,但是必须折衷,美工那边有给的单张图都过1024的。

接着是音乐音效的资源,将质量变低之后,大小从9M压到了1M。

做完这些后,UI从18M多压到了5.8M。

背景用etc1,这个格式是不带alpha通道的,大概一张1K的样子,有12张背景。

建筑的几张图用tinypng压缩的。然后读pixmap了对未解锁和解锁的分别生成rgb8888和numerance。

xml序列化

asset文件变小之后,加载速度仍然还是很慢。于是我开AssetManager的log后,分析了一下各种资源加载的时间。很大一部分是消耗在flash动画资源加载上。flash动画是我自己写的一个动画包,解析xfl文件得到动画信息,估测应该是xml文件解析花掉了太多时间。

动画的xml文件其实读到内存之后就是一个结构体,我可以直接使用这个结构体的序列化文件,这样加载二进制数据就可以避免xml解析。

做完这步优化之后,我这边感觉不算太明显,总体加载速度能感觉只能算有些提升。但另一个同事测试说序列化后的加载速度比原始解析xml方式速度提升了10倍。

尽量合大图

优化完动画文件的xml加载之后,我继续找最耗时部分。在自己手机上测试,音效资源加载较快,小的可能只有几ms。图片素材加载较慢,发现一张1024大概需要500ms。

现在最大的一个问题是flash动画的合图,我是一个动画合一张小图的。这样就会加载很多的小图,有60多个动画。加载几个小图速度远远慢于加载一张大图速度,每张小图可能要100到400的时间。

所以我又继续把动画的小图合大图了。

然后就是方块那边的合图也是小图改大图合了。

分步加载

最后就是做分步加载。动画,关卡的xml文件,这些都只有到游戏界面才用得到。我在进游戏loading时改成不加载这些资源,然后在进游戏时加载。

做完这些优后之后,包大小终于降到了14.8M,加载速度估算也几乎是原来的1/4了,完全可以承受的范围。超有成就感。

libgdx