缘起
最近在做avg类的游戏,特点是资源特别多,各种表现会比在下以前开发的游戏更丰富...
(当然,也许并没有那么细腻,但是丰富是肯定的)
功能完成了,就要开始兢(jie)兢(si)业(di)业(li) 地 优化了...痛苦并快乐着,谨以此文记录,
希望后来者看到这篇粗浅的稿子能够少走点弯路;
然后感谢cocos,用也用了,吐槽也吐了,但还是希望cocos越做越好 .
**
资源的优化:
**
1.图片资源
目前在下图片资源的优化主要有两种方式,一是图集,二是压缩(无论png还是jpg,其实jpg只能让你的包更小,但是其实是会更耗性能的,因为cocos会把jpg转成png再用…这个过程嘛…你懂的)
图集用的TexturePackerGUI打包(它还能整字体图集,具体请各位自行百度咯)
然后图片的压缩, 个人觉得 tiny 挺好用的,拉上去,拿下来,简单方便.
2.音效资源
音效其实说起来挺简单的,尽量打包成MP3,假如不是特别影响,还可以整成单声道…嗯,这个就比较看具体的需求了,一般来说背景音乐会大一些,需要优先处理.
工具的话,个人感觉瞄影工厂挺好用的…
3.spine资源
其实说实话,spine是在下目前仍在头疼的一个部分(不是资源,资源其实图片压缩好了,问题并不是很大…而是加载以及释放的问题,这个可能会放在下一篇跟大家一起讨论…暂且掠过)
**
加载优化
**
tip : 在avg游戏里面,图片的替换是非常频繁的,而且就像电影一样,用户还很可能随时读档跑回前面的章节去玩,所以有时候直接释放资源是不科学的(直接释放了图片资源,玩家读档回来就炸了…血泪的教训…)
所以,理想的情况下,过程应该是这样的:
一开始的时候,资源并不多,但是到了后来,当图片资源上百兆的时候,假如一次性加载资源到内存里,那就很恐怖了:压缩的资源多大其实没关系,看图片的大小,假设一张图片7201334,那么它的大小就是 (72013344) /(10241024) = 3M, 100张图片就是300M ,这还不算上其他的开销…
…所以只能进行预加载,然后放空(不,如果你确定后面还会用到的话, 暂时不要用cc.loader.release 等函数释放,不然会炸…别问我为什么知道…)前面已用过且暂时不需要的资源了,怎么做?直接把缓存下来的spriteFrame数组清空就好了…让js自己去管这事儿吧…
过程如下:
1.预加载图片 spriteFrames : cc.spriteFrame = [] //放进去
2.拿出节点,赋值sprite.spriteFrame = spriteFrames[curSpriteFrame] ;
3.这组图片用完了,回收 spriteFrames = [] //注意,其他地方如果有引用当前的spriteFrame , 那个spriteFrame是不会被释放的
4.跳到1
这样就能尽量保证图片的及时加载,而不容易跳帧了,由于时间关系,今天暂时就到这儿~ ~未完待续!