
首先宣传一下自己用一个月时间做出来的小游戏。感谢cocos团队的付出。
大家玩起来可能觉得项消灭病毒,确实借鉴了竞品游戏,不过我给游戏添加了剧情,略带悬念;每个boss设定了不同的人物性格,不同的感知能力和行为(也就是AI不同);有故事背景,还会有续作,其实还是有不一样的体验。
对于优化项其实论坛里已经有很多了,而且还有一些问题确实很难解决,先忍着,有时间再解决了。
前人的优化方案总结:
1、对象池,这个已经毋庸置疑了,肯定是要有的,但是官方提供的对象池在put的时候也会有卡顿现象,所以我自己对官方的对象池做了封装,用opacity 代替了put。
2、使用speedScale方式。这个确实有用,不过治标不治本,治本没时间。
3、四叉树:由于这种游戏碰撞特别多,使用循环是不现实了。不过我用两个四叉树分别存放敌人和主角的对象,在取对象的时候就不用排除自己发出的子弹了。
4、图集:我是将游戏中的和UI分成了两张图集,因为UI要频繁更换,所以做了这样的处理。然后是BMFont。所以游戏过程中draw call 始终保持在13,fps也都在1ms左右浮动。不过还是感觉回有温度,肯定还有优化的空间。
5、音效:我这里没有做暂停和恢复的处理,只是做了一个计数,子弹保持有两个,每帧播放一个。
下面说一下我自己做处理的地方:
6、ts对象池:所有new出来的对象也都使用了对象池,不论是ts类还是compnent 都实现了poolAble 接口,提供了kill方法。对于频繁创建的对象,都可以重复利用。
7、自己写了一个序列帧动画的类,使用的序列帧动画文件跟角色打到一张图集中使用,去掉了第三方的库,减小了包大小,目前压缩后的包体是3.2m,对于我们那会做j2me手机游戏来说,4m很大了。
8、对于引擎的源码也做了一些修改,比如getBoundingBox () 这个方法是我碰撞检测频繁调用的。所以之变的cc.rect()我缓存了。还有handleTouchesBegin 里边也做了这样的处理
let touch = this._touchBufer.length > 0 ? this._touchBufer.shift(): null;
if(!touch){
cc.log(’ new cc.Touch ')
touch = new cc.Touch(selTouch._point.x, selTouch._point.y, selTouch.getID());
}else{
touch.setTouchInfo(selTouch.getID(),selTouch._point.x, selTouch._point.y);
}
也没时间测是到底能提高多少,但是感觉效果还是不明显。当然,最好是引擎本身支持就更好了,但是那样需要更严格的使用规范,有利有弊,只是微信平台确实要求太高了。希望写的这些对后来人有所帮助,我也看了很多论坛里关于优化的帖子 ,大有启发,真心希望cocos越做越好,社区越来越活跃,不断壮大。希望有兴趣的朋友可以一起讨论,也欢迎有人指正我的错误观点。