对游戏逻辑和性能优化后,已经能保持在55帧左右了
请问一下:地图上有几百个点,每个点都要检测与蛇头之间的距离(距离近就被蛇吃掉),这样会导致很卡,这是怎么解决的? 还有蛇的移动我是用一个数组保存蛇头经过的位置,蛇的身体根据这个数组setPosition(),这会带来一个问题,游戏只要稍微卡一下蛇就会“断掉”,能说下蛇移动的解决方法吗? 谢谢~~
有一个简单易行的办法,将生成的新节点做成一个动画,只有两针,效果是前后错位,然后在放下该节点的时候调整方向即可
或者,节点自己挂一个脚本,脚本内容是每n针向前移动x个单位,再过n针向后移动x个单位,在放下该节点时调整方向
第一种方法可能会非常好用,第二种比较吃cpu
节点与节点之间距离保持固定值
嗯嗯,多谢指正,动画效果应该是颜色变化,而不是前后错位
谢谢你的意见,不过你的做法做需要各种换皮肤的话就会有问题了。大量切换纹理效率比计算位置更差
点与点保持恒定距离的话在旋转转圈的时候就会绕着一个点不停转动了,然后后面的节点就会全部停止运动。谢谢
楼主是怎么解决的,是把移动放到了c++上了吗?
请问用c++怎么写?我试了下jsb好像Action等js对象可以作为参数传进来,但cc.Node就有问题
请问谁有用c++写的demo吗?怎么都拿不到cc.Node
我的贪吃蛇也是1000个节点同时动,安卓真机上跑就只有40帧,现在也还是要用C++再做一遍了
解了一下贪吃蛇大作战的包,发现里面没有cocos2dx的so库,说明不是用cocos2dx开发的,这让我有点惊讶,而且包非常小,资源也没加密,看资源的分布,应该是用Java开发的,Java引擎一般是libgdx、andengine或者其他,游戏里面我试过蛇身上千个节点没有感到丝毫卡顿,玩上几个小时手机不发烫。如果用c++的cocos2dx来写,除非极致的优化,不然很难达到这个效果。看了下它里面的资源,所有图片并没有合一起,都是散图,这意味着在cocos2dx里面,每个节点都是一个drawcall,这要达到顺畅,估计有点难,我试过cocos2dxC++版的5000个空节点每帧一起移动,电脑上帧率都有点问题了……不清楚是作者花了大量心思去优化的还是引擎本身就是极致的优化,这让我有点匪夷所思。
这游戏另外一个难点是,里面的碰撞检测,里面只有圆与圆的检测,但是这游戏不可能用物理引擎来帮你检测,box2d和 chipmunk都无法达到这个效果,200个圆就开始卡顿了……也就是说里面的碰撞算法要么用了其他我不知道的碰撞检测引擎,要么自己写了一套,要么用像素检测。如果是单纯的圆检测,这计算量如果没有优化过也是恐怖至极,因为每条蛇的节点需要跟别的蛇头进行检测,还需要跟场景的食物点进行检测,蛇与蛇的节点检测复杂度就已经是n的平方了。
这游戏看起来简单,实际上真要做到原作者的那个程度,并不容易……不花一定的心思,是没法解决流畅度的问题。
是的,这做为我学习游戏开发的第一个游戏,我觉得这个游戏内脏特别全,该有的都有,很多人都觉得简单,其实里面的东西要优化的东西太多了,性能问题很严重,我现在还是在用H5测试的,对于一个新人来说,简直想哭,
圆圆检测是消耗资源最小的碰撞吧。。。
圆圆检测只要几个乘法和比较就可以搞定,但是当检测的量大的时候,会变得非常恐怖,100次检测看不出什么,但是上百万次就可以看出了,我电脑上测试的结果是1万次0.3毫秒(i5-4590)。假设自己蛇身长度为a,场景中一共n条敌对蛇,平均长度为b,一共有c个食物点,那么一共要检测an+bnn+c(n+1)。这个值很容易就上10万,而且这个是每帧都在检测,也就是每帧有3毫秒要给碰撞检测,而且还是PC端的……这是最粗暴的检测方式。
不过可以稍微优化一下这个检测,每次蛇移动的时候生成一个大圆,能把整个蛇身包起来(也可以用AABB盒),检测的时候先检测蛇头有没有在大圆里,在的话 再检测每个节点与蛇头。这样的话可以避免很多浪费的检测。
不用每个圆圆都用乘法,可以先用矩形检查,通过了再检测圆圆。而且还能给划区域碰撞,有很多优化方案的。
圆圈监测要什么乘法啊,比AABB低多了啊。。就是个圆心距离检测。。。。
2000个节点每帧都setPosition,在安卓上跑(红米note 4核2g)稳定在42帧左右。调成3000个节点能跑30帧左右。(用的2dx c++ 3.10)。如果游戏里面加上各种逻辑,估计也就能放1000节点,这样贪吃蛇玩的时间长点还是会卡。
你可以尝试去写下那个算法,不要用Vec2这些结构,这些类用起来确实好看,但是非常耗性能,只用float这些基本类型处理,那你就知道求圆心距离要不要用到乘法了。这两个算法并没有非常明显的性能差距,自己去写下对比下就知道,AABB之间的检测只有四个大小判断, 我这里就不贴代码了。不过我强调的重点是这些不起眼的算法在运算一定的量级后,会变得非常耗性能,需要下一定的心思去优化。如果游戏要求跑到60帧(PC端起码要这个帧数),那么一帧里面最多花费16.6毫秒,那么3毫秒在这里的占比会变得非常重要。

