最近在做一款生存挑战的 roguelike 抖音小游戏,“参考”的是steam上的吸血鬼生存游戏,游戏存在大量的怪和各种花里胡哨的武器效果,这就导致性能优化是一个很致命的点,无奈实在是才疏学浅,一直没有办法很好地解决这个问题。
第一个版本的游戏效果
项目历时差不多一个月上线第一个版本,第一个版本游戏中同时存在的节点数量(怪物、武器、场景中的ui节点、特效)能到700+,在iPhone上会很卡,但是在我自己的安卓手机上问题不大。
后面就减少节点数量什么……
当前版本的游戏效果;
当前游戏版本中我所做的一些优化技巧,还有很多不足的地方,欢迎论坛大佬们多多指导:
1·碰撞检测,没有使用引擎自带的碰撞系统,一开始想的就是用四叉树去实现碰撞检测,但出于项目的周期考虑,就直接选择林其大佬的高性能碰撞系统,就是等于是现成的四叉树插件了。
2·对象池管理节点,有些节点会提前缓存到游戏中:游戏中的怪物、弹道这些都是实时加载的。游戏中有突然同时出现的大量怪物,首次加载难免会出现突然掉帧的情况,这种我是通过让策划在怪物属性表上面添加一个预加载数量的字段,在游戏开始的时候根据这个字段选择性加载好放到对象池中,这样的做法在低性能的手机上第一次进入游戏的时候会稍慢1-3秒钟,好处就是在同一个加载大量怪物的时间点,不会有明显的卡顿感。
游戏中还通过分帧或者定时操作来减缓类似这种由于同一时间需要添加大量对象到场景上引起的卡顿感,类似可能第一分钟,存活怪物最低数量是40,然后第二分钟就是100,200这种,我在游戏中定义了一个全局的定时器,每过一秒钟就会去检测怪物数量是否符合条件,不够就立马补齐。这里就用到定时器schedule():
3·背景地图是用tiledMap做的:这个游戏是一个地图无限大的模式,角色可以选择任意的方向行进,所以要做到无缝拼接,理论上最少需要4份背景地图,但是做起来其实我觉得6份是最好实现衔接的(本人比较懒 ),结合角色最大可能的移速,背景大小,通过全局的定时器每隔5秒这样去更新一次。
4·采用的是静态合图的方法,使用TexturePackerGUI进行手动合图,打包的时候也会创建自动图集去把字体图片和地图文件图片合并,基本是ui一张大图,武器效果一张大图,怪物+字体+游戏中道具一张大图, 游戏前期dc在17左右,中后期特殊情况会到40-50的dc;
开始的时候我是考虑尽可能地将在同一场景用到的图片打包在同一个图集中,但是由于有要求“精美”一些,所以给到我的图片都是挺大的,然后有些平台又对图片的最大尺寸有限制,所以我就尽可能控制在2048*2048,这样是能有效降低dc了。
但是,这样会存在内存不足的隐患,就抖音后台很多用户反馈,玩着玩着就提示内存不足,退出游戏了。一开始以为是对象池里的保留的节点数量太多了导致的,因为游戏中,因为游戏中其实就是四张大图集:怪物+技能+ui+人物,然后就是音效了。在一个旧手机上显示内存超过550M就退了,然后对象池进行定时清理,甚至不保留,都不行。现在就觉得是图集的问题了,做了调整,进行了细分,暂时还没验证(方向有问题的话,还请各位大佬计时指正)
游戏中游戏技能还是会选择使用 拖尾、粒子、spine骨骼动画去做,我的本意是都用帧图,但是总有些老板觉得拖尾更好看,美术觉得粒子好、觉得骨骼动画做起来更方便,还有一些shader效果,这种就是从现实中硬生生将我游戏的dc给打断多几次……
5·同种音效会有一个冷却间隔才能播放,小游戏平台上,音效过度频繁也会造成卡顿。
6·怪物是实时跟踪人物方向的(update中执行),同时怪物之间会相互挤兑派拆(这个点没有做好)(碰撞回调中执行)
请教 :上面做的这些操作,那些是不合理的,跪求指正+指教!!!
抖音线上版: