区域寻路算法---改善服务器上的怪物寻路

自从有了自动寻路以后,这一功能已成了国内网游的必备,而且像已成了国内网游与国外网游的主要区别。

但目前好多网游,怪物还是不做寻路的,或只能做简单的寻路。因为寻路的消耗太大,服务器受不了。这直接导致了地图的制作非常困难,好多游戏一打开,地图就一个平面,毫无障碍。不过很多玩家在这种平面图里面倒也玩得蛮爽的。

这里撇开要不要往地图里加障碍不谈,只讨论如果在地形复杂的地图里,如何才能保证怪物能良好的寻路的问题。

先把问题规结一下:因为寻路算法的大消耗,导致怪物只能做简单的寻路,那么如果对下图中的简单行为:

 

      Monster   ---------------------------A--------------------------------------------------------------

                                                                                                                                     |

--------------------------------------------------------------------------------------------------||||      |

--------------------------------------------------------------------------------------------------||||      |

                                                                                                                           ||||      |

       Player                                      B                                                                  ||||      |               C

           |                                                                                                               ||||      |

           |                                                                                                               ||||      |

           |                                                                                                               ||||      |

           |                                                                                                                          |

           ---------------------------------------------------------------------------------------------------

 

由于中间存在障碍,玩家使用技能攻击怪物时,怪物要跑长跑过来攻击玩家时,这种行为是不被允许的。一般情况是,怪物直接穿过障碍过来攻击。

目前寻路用得最多的是A星算法,一般认为它的效率是最优的。使用它的一般方法为:将整张地图划分为固定等分的格子(比如512*512),将格子分为两种:障碍格和非障碍格,用A星寻路时,每步前进一个格子。

正是这种每步前进一格的方式,导致A星的效率与路径直接挂钩,所以,它不能用来在服务器上做长寻路。这也导致上图中的这种地形是不允许出现的。

有一种解决方式是开专用的寻路服务器来做寻路计算,这属于通过改变架构来解决问题的方案,目前不做讨论。

我的开发工作中也遇到这个问题,策划要求地图具有一定的复杂度,要有高度差。隔着河可以打对岸的怪,或者站在山上可以打山下的怪,但怪不能直接冲过来攻击玩家。

为了满足这一需求,我改进了以前的寻路思想,不再按障碍格来寻路。而是按区域来,将地图根据它的障碍信息划分成若干个区域,然后在这些区域间寻路,因为区域很大,所以寻路的效率就非常高了,可达到在服务器上进行寻路的要求。

首先我做了一个工具来自动生成区域,然后测试了一下,在地图上任意两点间都可快速寻路。

以下为我工具生成的一张区域图,此图为256*256的大小,图中的黑线为一次寻得的路径。

经过测试,一次寻路时间可达到0.001毫秒,基本与路径长短无关,可达到服务器上寻路的要求。

区域划分图

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值