我实现的一个 A*算法,效率极低,不知道为啥。

2015-09-07 13:25:19 +08:00
 liamxd

我在我的小游戏中添加了 A*的寻路算法。

结果寻路效率极低, open list 膨胀的特别快。稍微远点的路程就几乎死机状态。

代码在这里:
https://github.com/modouRPG/MoDouClient.git

6047 次点击
所在节点    游戏开发
13 条回复
MOsky
2015-09-07 13:28:19 +08:00
mark 下,睡一觉再看
zhicheng
2015-09-07 13:33:00 +08:00
https://github.com/zhicheng/pathfinder

我以前写的一个,很快啊,不过代码写很烂,不要学我。
liamxd
2015-09-07 14:09:02 +08:00
@zhicheng 看了一下,算法几乎相同啊。你那里不会遇到 open list 膨胀过快导致计算很慢的问题么?

我这里在遇到墙比较长的时候,起点和重点刚好在墙两侧比较对称的位置的时候, open list 会变的很长。然后就几乎死机。
zhicheng
2015-09-07 14:16:24 +08:00
@liamxd 只是很早很早以前写的一个 demo ,你能跑起来吗?有个 OpenGL 写的测试。
zhicheng
2015-09-07 14:29:18 +08:00
@liamxd 修了个编译错误加了 License 。可以直接在 Mac 上编译了。左键是加障碍,右键第一下是设置起点,第二下是设置终点,然后计算出路径。
yuchting
2015-09-07 15:20:19 +08:00
A*研究在学生时代研究良久,后来在工作全是用得广度优先了,效率完全跟得上。学生时代全是 std 容器,然后工作看别人写的全是数组,效率自然没法比,但是 std 容器多漂亮哇。。。
liamxd
2015-09-07 15:36:08 +08:00
解决了。现在效率还可以了。

改的地方就是:
点是使用的 class 。因为要比较相等,所以重载了一个==操作符。
在比较 A 点==B 点的时候使用操作符比较的。
我换成了直接比较点的 X 和 Y 值之后,速度嗖嗖的了。

真是叫人不解啊。
zerh925
2015-09-07 17:48:21 +08:00
不错!
也可以尝试 Dijkstra 或者蚁群算法 TSP 问题
jiangzhuo
2015-09-07 18:30:18 +08:00
出去程序实现上的问题,在有大块墙和封闭区间的时候加入 JPS 能快很多
WKPlus
2015-09-07 18:41:50 +08:00
你原来的代码比较的是两个指针是否相等,也就是比较两个指针是否指向同一个对象,而不是比较对象中的 x,y 值是否相等。改为*(*it ) == *point 才是调用重载的==进行比较。

大概看了一下原来的代码, childrenList 每次都是新生成点对象的,对象当然和原来的 openlist 的对象不一样,所以你的 openlist 会一直变大。
WKPlus
2015-09-07 18:43:38 +08:00
另外, operator==接受的参数一般是对象的引用而不是指针。
acros
2015-09-07 19:01:23 +08:00
直接打开看晕了···· 还是得下下来看才行。

其实我只想吐槽两点:
我写游戏还还真没用过 try catch··· 游戏引擎代码中,运行时的部分里也没有类似的印象。
构建路径列表那里好多 new delete ,肯定快不了。
sigroma
2015-09-08 12:20:46 +08:00
https://github.com/qiao/PathFinding.js
以前写 A star 的时候参考了一下这个项目中的 Trace 算法
这个算法会优先选择靠墙 /墙角的位置,面对大墙时速度比原始 A star 快很多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/218836

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX