游戏开发(十六) 之 性能优化 实例项目优化过程

目前这个塔防游戏没有做任何性能方面的优化,包括游戏内的合图,和子弹一类的缓存池都没有加,所以本篇以实战项目为例,进行逐步优化的工作.每一个步骤都会有详细的说明和帧率、dc的变化,基础的事情就不在叙述,很容易查到.先来说说性能优化,后面说说内存优化.

先来张效果图.

游戏开发(十六) 之 性能优化 实例项目优化过程_第1张图片

真机跑,基本上满屏幕炮塔和怪物的时候,最低帧率有10帧,可以说目前是根本无法进行游戏的程度.

先看下设备情况:

游戏开发(十六) 之 性能优化 实例项目优化过程_第2张图片游戏开发(十六) 之 性能优化 实例项目优化过程_第3张图片

cpu是麒麟659,目前市场价1500,基本属于中端偏下机型.看看目前的情况能优化到什么程度

当前:

draw_call:900左右

帧率:10左右

思路:

  1. GPU优化,降低drawcall
  2. CPU优化,降低帧刷新内的运算量

接下来我们一步步处理优化方面的事情:

第一步:把炮塔的资源全部替换,并且合成了大图

游戏开发(十六) 之 性能优化 实例项目优化过程_第4张图片

替换完资源,资源量比之前要多很多

当前:

draw_call:500左右

帧率:10左右

变化: dc减少400左右, 帧率几乎没变

第二步:把地表,子弹,特效,全部替换,并且合成了大图

游戏开发(十六) 之 性能优化 实例项目优化过程_第5张图片

当前:

draw_call:300左右

帧率:10左右

变化: dc减少200左右, 帧率几乎没变

第三步:把数字飘血替换成艺术数字

游戏开发(十六) 之 性能优化 实例项目优化过程_第6张图片

这里我用的是cc.Label:createWithCharMap , 之前用的TTFLabel,效率极低,因为他每次创建都会重新渲染一次

看了下源码,每次创建的时候除了做文本的解析,纹理会做缓存,虽然DC没变,但效率方面会提升不少

当前:

draw_call:300左右

帧率:20左右

变化: dc没变, 帧率从10提升到20

第四步:做子弹缓存,减少每次创建的消耗

游戏开发(十六) 之 性能优化 实例项目优化过程_第7张图片游戏开发(十六) 之 性能优化 实例项目优化过程_第8张图片

这个地方把子弹做了个缓存,防止重复创建的消耗,这里有个地方需要注意下,就是缓存起来的子弹,千万不要从父节点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

第五步:掉血Label缓存

游戏开发(十六) 之 性能优化 实例项目优化过程_第9张图片

跟子弹缓存是一样的原理,为了减少创建删除的消耗.

这个地方,因为用的是png字体,后期如果还需要继续优化的话,可以自己实现数字拼接,然后一样使用批处理,也可以更多的降低drawcall

当前:

draw_call:300左右

帧率:40左右

变化: dc没变, 帧率从30提升到40

 

第六步:建筑小兵加到批处理,重做掉血label

游戏开发(十六) 之 性能优化 实例项目优化过程_第10张图片

这里我用sprite自己实现了一个图片lbl,因为batchnode不支持sprite以外的child,所以没办法就自己写一个好了

1.建筑小兵加入到批处理中

2.数字飘血加入到批处理中

当前:

draw_call:稳定19

帧率:50左右

变化: dc只有19了, 帧率从40提升到50

这里可以看到 dc只有19了,而且这里面的19 其实就是左上角,左下角,还有右下角,的几个文本和按钮

目前可以达到50帧,初步判断是自制lbl的重复create remove造成的

第七步:增加自制字体缓存

游戏开发(十六) 之 性能优化 实例项目优化过程_第11张图片

最终:

draw_call:稳定19

帧率:游戏全程接近60帧

目前来讲,对于游戏体验上来讲,就没什么问题了,对于中下配置的机型,可以达到50+,那绝大部分机型体验就没问题了,后续可能会降低帧率的地方 基本上都是cpu的问题,也就是你的逻辑代码,如果处理得当,全程50帧+是没问题的

然后就是一些细节方面的优化,尽量不要在tick里面使用for循环,随机数,如果运算量太大,可以考虑跳帧处理,尽量可以预先加载的东西放在战斗之前缓存起来,包括随机数也是一样.拿空间换时间,性能优化方面,更多的是要在各个细节中,达到最优的处理.

 

因为目前游戏内容暂时就这些,因为经验的原因,所以没有用到任何性能分析工具就做好了优化,如果后期遇到性能瓶颈,没有什么思路的话,就需要使用配套工具来配合优化,以此游戏的战斗体量,应该可以满足大部分轻度游戏了

有问题和建议可以留言交流

你可能感兴趣的:(游戏开发之路)