寻路算法优化

由于老版本项目要在wegame上面项目,要把新版本的寻路系统迁移到老版本上。

先开始就是迁移A*算法过来。

我们的寻路需求有以下特点:

1.角色人物是有碰撞体积的,因此是存在动态主档点的。

2.有比较大的地图1000x1000,且阻挡点也相对较多。

3.由于几乎所有地图中不存在孤岛(有例外情况),因此也没有时间限制。

老的A*算法主要解决了以下特异性的问题:

1.终点不可达时,使用连线T探索替换终点。(这里最后用逆正方形搜索法 按半径1-100的正方形搜索最近可达点)

2.由于没有时间限制,且地图较大,独立起了一个线程来算路径,防止阻塞主线程。

3.存储了一个last_node来存储离终点最近的节点,用来反向溯源(这里主要是针对孤岛和不可达的特殊情况,这里会以起点遍历完所有连通节点)。

4.由于根据当前的阻挡点情况计算了起点到终点的路径,当行走过程中走到有动态阻挡点的路径上时会重新寻路。

迁移完成后发现大地图寻路耗时太长,响应太慢了,点击几秒才开始走,影响游戏体验。

使用JPS算法

Jump point search算法,实际上是A*的变体,跳点寻路的优点主要在关键节点的叠代上,我们之后A*算法的叠代每次更新最优节点的临近八节点数据。就算中间没有障碍物,从起点到终点也要把中间的节点依次加入开闭表才能找到终点。

跳点寻路,主要在叠代中进行了剪枝,减少了对称路径,这里的理论知识可以参考

我这里简介点讲就是跳点的搜索原则

解释JPS原理,英文版本的比较好

一、先水平再斜向

    水平方向找到跳点或者障碍停止,一次叠代多步

    斜方向每次移动一步

二、跳点规则

1.水平垂直方向

父节点水平方向 如果节点垂直方向临近节点有障碍物,成为跳点。 父节点垂直方向 如果节点水平方向临近节点有障碍物,成为跳点。

 2.斜方向

父节点斜向,父节点和该节点的公共邻居节点有障碍物,成为跳点。

3.当斜向探索时,其水平垂直分量上有跳点,那么该斜向探索点也是跳点(这个地方很难理解,因为我看到的所有资料几乎都没有解释这个跳点有什么作用,我最先开始实现的时候也没有加这个跳点。但结果是能找到终点,但是路径存在一些问题,其实这个跳点主要是保证路径的全局最优的,因为这个跳点可能会添加一些靠近终点的中间跳点)

三、跳点的搜寻方向跟父节点相关,没有跳点的情况下,搜索方向如果是水平或垂直则与父节点搜寻方向相同,

斜方向除了加上父节点方向外还要搜索其斜向的水平垂直分量方向。有跳点(跳点规则中的1、2规则)还需要根据情况加上对应的节点方向。


实现后发现JPS在内存和耗时上都有比较大的提升。

注意要点

1.启发函数

启发函数

这个函数跟叠代速率以及最优路径相关,比较重要。

2.closedset的评估值g到底要不要更新

看情况,如果你是要找一个最优路径,那么要更新closedset的g值以并且递归形式更新子节点值,因为其后继节点可能在openset中,会影响下一个最优节点的选用。

当然一般来讲对于游戏来讲,只要你的启发函数没有大问题,不更新closedset的值影响也不大,就是可能有一些局部没有按最优的路径走,影响也不大。

3.独立线程寻路动态点的加锁,加锁会影响性能。但是实际上远距离的寻路,判断离当前比较远的区域的动态点意义不大,是否只判断离当前节点较近的动态阻挡点更好。

后续跟进问题

引入JPS算法之后长距离的寻路问题解决了,但是短距离的寻路产生了新的问题,游戏组队跟随出现卡顿情况,起初认为是算法问题,后面发现是服务器同步的问题。由于JPS总是倾向先斜向走再十字方向走,跟随时如果队长在十字方向,其他所有的队员在跟随时都会争抢十字方向的位置,导致不同队员向服务器同步位置时会失败,因为队员都是有阻挡点的,JPS算法会导致这种冲突发生的概率变高。

这边最后还是针对短寻路进行了优化,短距离还是使用A*算法,A*算法在短距离寻路的性能消耗也是可接受的,而且冲突的概率不高。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容