TW项目寻路算法最优实践


一、描述
        TW项目是一个拥有较广阔野外空间的SLG游戏,玩家的军队方阵可以在野外进行长距离行军、短距离自由行军、占领要塞、驻扎、形成战斗阵型战斗等行为。其中,野外的山脉、河流等会产生静态阻挡,可能会用到navmesh寻路;而由玩家把守的要塞、由玩家在空地上的驻扎行为,会在野外地图上产生动态阻挡;自动形成战斗阵型等行为,可能会兼用鱼群寻路算法或者RVO避障寻路算法。
        每个服务器活跃军队方阵可能有几万个,每天产生的长距离寻路请求可能达几十万或者百万个,而用常规的A*寻路、navmesh寻路算法计算量巨大,并且很多长寻路是由服务器端计算或者校验,影响服务器效能,所以我们必须找一个快速长距离寻路、校验的方法。由于玩家可以自由行军,产生的短距离寻路比长距离寻路数量更多,所以我们必须找一个能快速校验短距离路径的方法。由于在野外会产生动态阻挡,随时挡住长/短距离寻路的路径。
        本文给出了对于问题的分析和解决这些问题的方法。

二、需求
1、前端长距离行军寻路
2、后端长距离行军寻路(由于有些军队方阵所属于的玩家不在线,需要在服务器启动时或者玩家离线前有任务委托时寻路)
3、对前端长距离行军寻路的校验
4、前端短距离行军寻路
5、后端短距离行军寻路
6、对后端长距离行军寻路的校验
7、行军中遇到动态障碍物(要塞、驻扎的敌人)后停止
8、对战时形成战斗阵型(如步兵在前,工兵在后等)
9、军队方阵有最大密度,单位区域内达到最大密度会形成阻挡
10、隔障碍物(如河水)远距离攻击
11、追击(追击者最优路径)
注:以上所有需求是2D寻路

三、最优实践步骤
对于需求1-6,下面的第1,2,3步骤可以全部解决。
1、用navmesh寻路算法的第一步,为野外地图创建寻路面片并且优化,达到面片总数量最少、单个面片面积最大(要保证面片是凸多边形)即可;
2、用蚁群寻路算法、或者IP地址寻路算法、亦或者带权重网状递归寻路算法,计算形成静态网状路图,保存为数组,用来求寻路粗路径;
3、用漏斗寻路算法对第2步的粗路径计算得细路径(此步骤即可一次计算到终点也可以逐步计算);
4、对于需求7,军队方阵行军过程中,后端每隔一定的时间用第3步算法寻找未来一定时间内是否有动态阻挡。
        4.1)先按时间计算出长度;
        4.2)当前位置为起始点与最终目标地点拉直线,长度在本面片内的直接计算下一目标终点,计算完毕;
        4.3)长度超出本面片的,与下一面片连相交的直接按4.2方法计算下一目标终点,如果下一目标点在本面片内,则计算完毕;
        4.4)4.3步骤中与下一面片不相交的,则连接边线段的近点为折线点,这个点也是下一个起始点,重复4.3,直至到达4.1计算的长度或者到目标地点,计算完毕;
        4.5)4.3步骤中与下一面片相交,但是计算完下一目标点不在本面片内,以与再下一面片连接边的交点为起点,重复4.3,计算完毕。
        注:因为第4步所谓一定的时间,是一个较短的时间(如1秒)所以路径总长度不会太大,又由于第1步保证了面片面积尽量大,所以第4步的运算通常在4.1就结束了,不会有太大的效率问题。
5、对于需求8,由于只是前端表现,不牵扯后端严格校验,所以可能会采用鱼群算法寻路。
6、对于需求9,同样采用第3,4步的计算方法,并且在短寻路后查看一下目标位置人数,如果超出规定数量后则不再前进。
7、对于需求10,与战斗计算相关,与寻路不直接相关
8、对于需求11,也是前端每个一定时间,计算当前位置与要追击目标的最优路径,如果比当前路径优,则发给服务器并按新路径行军。

四、拓展
        寻路的算法有很多,各自应用在不同的场景。本次最优实践筛选了十几种不同的寻路算法,本文参考、采用或者部分采用了其中4,5种,也将一些算法拆解只用其中一部分,然后还自创了一些寻路算法,自创部分是最大化的用空间换取时间,最终达到了后端的长距离行军粗路径寻路CPU消耗为0的程度,然后在军队方阵行军时用很小的代价逐步细化路径。

五、专有名词解释
1)工会/帮会:由大概40玩家组成的组织,互为友好阵营,可以一起做一些事情。
2)野外要塞:野外的狭小的口装区域(如桥、山谷、城门等等),可由工会占领,形成对本工会会员可以通行但对敌对工会会员产生阻挡。
3)驻扎:点击玩家的军队方阵后,有驻扎按钮,点击后原地驻扎,驻扎成功后形成阻挡。
4)长距离寻路:指跨越手机整个屏幕或者跨越若干个面片的寻路。短距离寻路与此相反。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐鹏V

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值