【问题标题】:Mass astar pathfinding大众astar寻路
【发布时间】:2012-04-24 15:38:51
【问题描述】:

我正在尝试用 Javascript 创建一个塔防游戏。

除了寻路,一切都很顺利。

我正在使用来自该网站的 astar 代码:http://www.briangrinstead.com/blog/astar-search-algorithm-in-javascript,它使用二进制堆(我认为这是相当最佳的)

我遇到的问题是我想让人们阻止“攻击者”的路径。这意味着每个“攻击者”都需要能够自己找到通往出口的路(因为有人可以切断一个“攻击者”并且它需要自己找到通往出口的路)。现在 5/6 攻击者可以在任何时候毫无问题地寻路。但是假设路径被 10 多个攻击者阻止,所有 10 个攻击者都需要同时触发其寻路脚本,这只会将 FPS 降低到大约每秒 1/2。

对于任何时候都有很多实体寻路的人来说,这一定是一个常见的问题,所以我想一定有比我的方法更好的方法。

所以我的问题是:以最有效的方式对多个“机器人”实施大规模寻路算法的最佳方法是什么。

谢谢,

詹姆斯

【问题讨论】:

  • 看起来该代码中的findGraphNode 需要线性时间,而它应该需要恒定时间(使用哈希表),因此实现远非最佳。
  • 我看看能不能加快一点速度。但是我认为即使使用更有效的路径查找,如果我尝试对机器人进行路径查找,我仍然会以缓慢的帧速率结束。我开始认为我最好的选择实际上是每帧对整个地图进行一次路径查找,然后设置一个方向在机器人跟随的每个可通过的块上..
  • @james 如果这与大多数塔防类似,大约有一个屏幕的地图,没有复杂的碰撞(即机器人不会相互碰撞或其他移动物体,或者你单独处理这个) ) 那么是的,我认为计算整个地图的路径是最好的。事实上,您甚至可能不必每帧都重新计算整个地图。如果您在构建算法时小心翼翼,您应该能够确定哪些节点受到用户更改的影响,并仅从这些节点重新计算“上游”。听起来很有趣!
  • @james 您或许可以使用 Dijkstra 的算法作为一个粗略的起点。作为旁注,算法寻路可能有点无聊并且(取决于游戏)不切实际。您可能会考虑替代方案,例如转向行为,它们不仅速度快,而且不能保证完美的路径。如果做得正确,这可以给你的机器人更多的“生命”,但这是否可取取决于你。

标签: javascript html path-finding a-star


【解决方案1】:

只缓存结果。

将路径作为值存储在哈希表(对象)中,给每个节点一个 UUID,连接 UUID 以形成唯一的哈希表键并将路径插入其中。

当你从哈希表中检索出路径时,遍历路径,看看它是否仍然有效,如果不是,重新计算并重新插入新的路径。

你可以做很多优化:)

就像 c69 所说的 swarm AI 或蜂巢思维:P

【讨论】:

    【解决方案2】:

    使用 Anti-objects,这是获得廉价寻路的唯一方法,afaik: http://www.cs.colorado.edu/~ralex/papers/PDF/OOPSLA06antiobjects.pdf

    Anti-object 基本上意味着你将拥有一个绑定到你的游戏地图的“swarm ai”,而不是机器人拥有单独的人工智能。


    p.s.:这是另一个关于一般寻路的链接(可能是最好的在线参考): http://theory.stanford.edu/~amitp/GameProgramming/index.html

    【讨论】:

    • 感谢您提供的资源,稍后我会看看。尽管就您所说的而言,寻找整个地图的路径似乎更有意义,并且可能在机器人遵循的每个“块”上设置一个方向.. 嗯
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多