接上一个复刻英雄联盟的文章,现在把寻路放服务器上了,遇到新问题

参考了一些a*寻路后,在go上面自己写了一个,目前1000 * 1000格子,左上到右下的寻路消耗是5ms,想知道到底需不需要1000 * 1000的格子呢

因为我的理解是服务器如果是100 * 100的地图,显然不够精确,因为客户端寻路点地板,不可能每次都点到1格的中点

所以是不是只能增加服务器的格子数比如加到1000 * 1000,精度就从1提高到0.1,相当于把客户端1格分割成10格的概念,客户端点击了地板,找离这点击点的10格中最近的1格作为终点发送给服务器。起点也是,只不过是由服务器计算存储的现在的位置的最近的1格作为起点。这样虽然还是有接近0.1的误差,貌似能接受


接上次的,目前应该是把路径平滑做出来了
先去重+再使用直线障碍判断

:upside_down_face:

没太理解你说的这个精度概念,你说你点不到格子中心?这不是寻路问题要考虑的
如果就你说的点中心的概念来说 你点不到也没关系啊 你知道点到哪个格子了吧至少,好 那你就强制它去格子中心就是了

楼上说的其实也可以,用简略的格子寻路,每次走的时候,先从起点跑到格子中心,然后沿着路径走完到目标格子中心,再从目标格子中心到目标点。

另外我想问问,客户端有完整场景信息的情况下(不是大世界),为什么不是客户端寻路,寻完路进行路径精简后,和移动一起把路径发给服务器呢?而是服务器寻路?

你把地图分为多层的就好了。假设是真实世界。比如你的地图是1000m1000m。
你先用10m
10m的格子做第一层寻路,然后10m10m的你分为1m1m。这样寻路就快了。

或者你直接搜一下星际2的寻路算法。

性能优化可以对路径缓存,空间换时间,或者使用跳点寻路算法(根据实际情况)。
精度问题可以搞分层寻路,在需要精确寻路的区域使用更细的网格。

我的意思是,格子在服务器表示是个二维数组中的一个元素,然而二维数组元素都是int,100*100的地图不可能能精确定位你客户端点的地板位置,比如客户端点了1.5,2.5,如果服务器1格是1米,那么这个终点坐标到底是1,1还是2,2,就算是,精度也差0.5

因为英雄联盟小兵野怪那些是服务器控制的寻路

包括人机模式也是

算是AI吧

经过测试,发现开启列表的排序占用耗时达到一次寻路的90% (高亮部分就是这段排序的代码)

有没有佬指点啊,算法一窍不通 :joy:

能详细说说吗,不太明白,而且英雄联盟这种地图怎么用10*10表示

路径缓存。你的意思是寻路过的2个参数点,寻完缓存起来,下一次直接返回是吗。感觉命中率不高,因为有50W个不同的2个坐标。一局游戏点1500次也就接近0.3%概率。JPS听说是挺牛逼,但是估计没空研究了 :upside_down_face:

分层寻路确实没接触过,有没有佬能画图说明下 :upside_down_face:

打个比方, 你地图为1000m*1000m, 第一层地图用 10x10 的二维数据, 制1格数据代表100m * 100m
第层可以用100x 100 的数组,即 1格代表10m * 10m,
当角色要移动时, 判断角色与目的地在地第一层是否为同一格, 不是则第一层寻路, 但到达第一层终点后执行第二层寻路。
若果角色与目的地在第一层是同一様则直接用第二层地图来寻路。

而且服务器寻路能防作弊,这是后话了

你先从1走到4,只有22的格子,你再从a走到d,还是22的格子,但是你开始就从1走到d,是有个4*4的格子

我想知道就是到4的时候,是从4的中心开始走到a,再从a到d吗

假设要从b 走到 大D.只是我的做法,我先把b划分到区域1,然后大d划分到区域4,先从1到4,到4的左下角(大A)。最后从大A到大D,我也没写过”减枝“的,但是我的想法是这样

了解了,谢谢。没弄过moba不太熟悉,小怪也有寻路需求。