目前这个塔防游戏没有做任何性能方面的优化,包括游戏内的合图,和子弹一类的缓存池都没有加,所以本篇以实战项目为例,进行逐步优化的工作.每一个步骤都会有详细的说明和帧率、dc的变化,基础的事情就不在叙述,很容易查到.先来说说性能优化,后面说说内存优化.
先来张效果图.
真机跑,基本上满屏幕炮塔和怪物的时候,最低帧率有10帧,可以说目前是根本无法进行游戏的程度.
先看下设备情况:
cpu是麒麟659,目前市场价1500,基本属于中端偏下机型.看看目前的情况能优化到什么程度
当前:
draw_call:900左右
帧率:10左右
思路:
替换完资源,资源量比之前要多很多
当前:
draw_call:500左右
帧率:10左右
变化: dc减少400左右, 帧率几乎没变
当前:
draw_call:300左右
帧率:10左右
变化: dc减少200左右, 帧率几乎没变
这里我用的是cc.Label:createWithCharMap , 之前用的TTFLabel,效率极低,因为他每次创建都会重新渲染一次
看了下源码,每次创建的时候除了做文本的解析,纹理会做缓存,虽然DC没变,但效率方面会提升不少
当前:
draw_call:300左右
帧率:20左右
变化: dc没变, 帧率从10提升到20
这个地方把子弹做了个缓存,防止重复创建的消耗,这里有个地方需要注意下,就是缓存起来的子弹,千万不要从父节点remove掉,cocos内部在remove和add的地方也是非常消耗性能的,我在第一次做的时候就是先remove在add,发现提升根本不大,于是就不remove,直接隐藏,使用的时候在显示出来,直接使用,大概看了下源码,没有做详细测试,但发现里面有好多个for,并且逻辑很多,包括对父级数组的操作,性能应该是损耗在了这个地方
因为不复杂,贴一下缓存池的代码
--缓存池
XXPool = {}
--子弹缓存 5种子弹的缓存
XXPool.bulletPool = {}
--添加子弹到缓存中
XXPool.PushBulletByType = function(_type,bullet)
table.insert(XXPool.bulletPool[_type],bullet)
end
--从缓存中拿子弹
XXPool.PopBulletByType = function(_type)
if XXPool.bulletPool[_type] == nil then
XXPool.bulletPool[_type] = {}
end
if #XXPool.bulletPool[_type] == 0 then
return nil
else
local bullet = XXPool.bulletPool[_type][1]
table.remove(XXPool.bulletPool[_type],1)
return bullet
end
end
--清空缓存
XXPool.CleanAllPool = function()
XXPool.bulletPool = {}
end
当前:
draw_call:300左右
帧率:30左右
变化: dc没变, 帧率从20提升到30
跟子弹缓存是一样的原理,为了减少创建删除的消耗.
这个地方,因为用的是png字体,后期如果还需要继续优化的话,可以自己实现数字拼接,然后一样使用批处理,也可以更多的降低drawcall
当前:
draw_call:300左右
帧率:40左右
变化: dc没变, 帧率从30提升到40
这里我用sprite自己实现了一个图片lbl,因为batchnode不支持sprite以外的child,所以没办法就自己写一个好了
1.建筑小兵加入到批处理中
2.数字飘血加入到批处理中
当前:
draw_call:稳定19
帧率:50左右
变化: dc只有19了, 帧率从40提升到50
这里可以看到 dc只有19了,而且这里面的19 其实就是左上角,左下角,还有右下角,的几个文本和按钮
目前可以达到50帧,初步判断是自制lbl的重复create remove造成的
最终:
draw_call:稳定19
帧率:游戏全程接近60帧
目前来讲,对于游戏体验上来讲,就没什么问题了,对于中下配置的机型,可以达到50+,那绝大部分机型体验就没问题了,后续可能会降低帧率的地方 基本上都是cpu的问题,也就是你的逻辑代码,如果处理得当,全程50帧+是没问题的
然后就是一些细节方面的优化,尽量不要在tick里面使用for循环,随机数,如果运算量太大,可以考虑跳帧处理,尽量可以预先加载的东西放在战斗之前缓存起来,包括随机数也是一样.拿空间换时间,性能优化方面,更多的是要在各个细节中,达到最优的处理.
因为目前游戏内容暂时就这些,因为经验的原因,所以没有用到任何性能分析工具就做好了优化,如果后期遇到性能瓶颈,没有什么思路的话,就需要使用配套工具来配合优化,以此游戏的战斗体量,应该可以满足大部分轻度游戏了
有问题和建议可以留言交流