android游戏资源优化
2013-10-27
我的游戏apk包的大小增加到36M了,而且加载速度也奇慢无比。没办法,不得不做资源优化了。下面是记录下这些点点滴滴。
优化的内容
其实主要就是三个方面:
- 最终的发布包大小
- 加载速度
- 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了,完全可以承受的范围。超有成就感。