用A星寻路发现原生平台性能问题

最近试着做一个RTS类型游戏,首先想到的就是点击移动角色得让其会自动寻路,于是搜了下论坛找到了luckytianyiyan前辈做的A星寻路演示(http://forum.cocos.com/t/a/36924),然后就在这上面做测试。
试了下添加怪物让其每过几秒就往地图随机点移动,当然每次移动都调一下寻路脚本,设置了最多添加50只怪物,在Web和模拟器上运行都很流畅,但发布到安卓手机上就发现有卡顿现象,大概怪物有5只以上时就会。不过这个A星寻路有2个模式,一个是4方向的,一个是8方向的。4方向的手持端也很流畅,就是切换成8方向就会卡顿,8方向必然加大了运算量。
luckytianyiyan前辈在帖子里也说了这个A星寻路算法存在性能问题,这可能是一个因素。但是既然Web端很流畅,而一到手持端就卡顿,这或多或少和引擎对原生平台的性能优化程度有关吧。
附上这个测试的工程文件和打包好的APK文件,大家可以试下。默认是4方向模式,点击右上角的4 direction按钮可切换到8方向,点击
AddEnemy按钮添加怪物,点击AddUnit添加我方炮塔单位,最多在场的各能添加50只。(PS:请无视里面神奇的代码写法-.-里面那只小怪物素材盗取manklw前辈一个DEMO里)
微信上说1.6版本将会进一步提高原生平台的性能,很期待啊~希望到时可以解决上述这个在手持端的卡顿问题。也很希望引擎可以自带一个寻路组件,比如只用cc.moveTo动作就能让它自动找到一条绕过障碍物且最短的路径,像Unity3D里的Navmesh。


APK:http://pan.baidu.com/s/1c1Z3Kli
A-star-master_20170525.rar (2.5 MB)文字缩进4格

2赞

针对怪物随机移动这种需求,也可以不用A星寻路。

先用简单的寻路:
对于每个怪:随机出附近的一个点,让这个怪物向这个点移动,如果下一个点有阻碍,尝试向相邻的左右方向移动。

一般这个简单决策都可以解决80%的问题。

如果真的实在是走不到目标点,再启用自动寻路。

这样应该可以解决你的卡顿。

当然引擎的性能是另一回事了。

1赞

JSB 性能提升任务正在加紧进行中~~~

2赞

你用JS写A星!在Native上跑,那效率不用说,坑定烂!这种算法,Native最好是用C++写(用JSB绑定到JS)
就算升级了JSB性能也是一样的!(最多好点点)

1赞

以前有亲自做过A星,楼上正解,千万别用脚本去做A星,用C++,还有A星内部的所有内存分配使用内存池,计算深度也要限制。

还有一个办法,就是使用unity,引擎帮你搞定了这个,根本不用自己去实现寻路,场景管理,加载什么的。

恩,这样可以减少使用寻路频率

原来如此、、Unity是有个寻路组件,Cocos Creator也能整个就好了。

AStar.zip (5.0 KB)

这个有个Astar算法,性能还可以,贡献给你了,我几年前用cocos做了个失败的arpg留下的,拿别人贡献的算法优化的,内存管理自己处理一下。

1赞

你这个办法也够损的:joy:

也不至于损吧,cocos做成这样已经很不容易了,引擎开发者都是一等一的牛人,我只是从做项目的角度去提的办法。

:grinning:多谢大大!

A星不难写,优化比较花时间
一般是用最小二叉堆来做
这些东西STL都提供了的
C++做这个再合适不过

用了1.6版本构建编译后在安卓上运行就不卡了,原生平台的性能确实大幅度优化了~

1赞