`

关于两款游戏的自动寻路及同步技术分析报告

 
阅读更多

from: http://wenku.baidu.com/view/cf3353df50e2524de5187e36.html

 

关于两款游戏的自动寻路及同步技术分析报告

 

测试环境: PC机,双开不同角色的客户端

测试目的: 得到现在市场上主流游戏的自动寻路和玩家同步的实现方式的技术分析。

前提分析: 首先,需要说明几点,游戏中位置信息的同步,其实质是在同步时间。根据T=S/V的公式我们可知,事实上我要需要不同客户端上的角色移动在相同的时间内完成同一事件,那么我们一旦因为延迟造成不同客户端的角色位置差异就要通过更改2点来实现弥补。

 

  1) 一是改变S,即不同客户端上同一角色在执行一个移动事件时,所行走的路程不同。即,在不同客户端产生位移差距后,我们通过改变落后,或者置前的客户端玩家所走的路程来实现位移弥补。实现该思路必须解决的问题就是:因为自动寻路是根据A星算法得出,因此所走的路线才不可能与碰撞体相撞。而一旦我们通过改变S来实现同步的话,必然会使玩家所走的路线有所不同。

因此表现为:本地客户端在模拟网络玩家的移动的时候,一旦改变了路线,就可能让角色与碰撞体相撞。

也可以使模拟的角色产生瞬移来模拟,该方法一般是出现在角色位置信息差距较大的时候。

 

    2) 二是改变V,即所走的路线完全是有该角色的本地客户端所计算出来,通过服务器传输给不同的客户端模拟,而网络延时所造成的位移差,只有通过不同的速度来使角色基本在同一时间完成同一个寻路事件。(本方法也就是我所提出的方案,即天龙八部所采用的方式)。

 

表现为:玩家移动时的速度可能根据不同的网路延时而改变。

另外也可以采取低阀值的位移模拟,一旦网路卡住则停下,等待新的数据到来再进行移动。

表现为:角色的移动过程中会出现大量停顿。

 具体游戏分析

 

1.蜀门

游戏类型:蜀门是一款2.5D的武侠风MMORPG类游戏。

游戏中的角色同步的分析: 首先,经过2个不同角色的分析,发现该游戏的同步具有以下几个特点:

    1. 本地客户端先行模拟。即不论本地客户端的位移信息是否需要服务器的反馈,系统都是先默认让本地客户端的角色先行执行移动。

表现为:点击移动之后无论网路是否延迟,都将瞬间执行移动。

 优点:可以让本地用户的角色移动异常流畅,丝毫不受网络的影响,带给用户流畅的游戏操作感。缺点:因为此方式的前提是先默认本地客户端所计算出的位移信息是完全正确的。因此可能带来一些用户先行模拟而进行了一些非法的操作的问题。如果要避免速度外挂所带来的问题,则需要服务器端对发送过来的信息进行严格验证。

       2. 游戏中本地客户端模拟网络玩家的运动时,网络玩家的移动速度并没有出现改变,而采用的是移动过程中不断停顿的方式来实现的移动模拟。当与正确的位移信息差异过大时候,采取瞬移的方式来纠正位移。

游戏中角色所走的路线完全不同。即我发现当网路相当卡的时候,本地玩家角色进行了2次寻路事件,而同角色的网络玩家角色的模拟只执行了一次寻路事件,但基本保障了执行完事件后玩家所在的位置是相同的,但是因为所走的路线不同,所以有可能会造成穿越碰撞体的事件。除非在模拟之前,网络角色所在的客户端也进行了一次A星算法。最后,我找了一个碰撞体,并切针对带碰撞的自动寻路进行了观察,发现2个客户端针对同一个寻路事件,皆进行了A星算法,因此才造成的2个客户端角色所行走的路程不同。本地客户端走的路线如图1.1,另一客户端看到该角色所走的路线为图1.2。因为S不同,V相同,则可知,2个客户端所完成寻路事件的时间是不相同的。但是可被控制到一定的范围。

总结:由于该游戏采用的是V不变,而多种方法改变S的方式来实现移动同步,因此游戏画面中会出现闪现,行走路线完全不同,开始和完成寻路事件的时间完全不同。网络角色的开始移动模拟与本地客户端的开始移动之间的间隔大约在1-10+秒左右,取决与网络速度。因此可确定该方法的实现思路如下:

 

1.该游戏采取的方式并非是路点信息的传输来实现的。

 

2.  对于网络角色的移动模拟,采用了2种方式,一是当移动不涉及碰撞体,或者不可行走区域时,我们采用了直接直线行走的方式,未完成的寻路就需要改变时,直接改变目标皆可。(这点可采用射线检测的方法来判断是否需要A星算法),当需要使用A星算法时,网络角色的模拟采用的是只需要知道目标点,具体的路线由需要模拟该网络角色的本地客户端承担计算。因为野外地图发生碰撞的可能行比较小,再加上只计算同屏的玩家的位置模拟,因此客户端能承担。也因为如此才会使2个客户端之间的路程产生不同。

估计实现该效果的服务器通信数据结构应为:

Send(CurPos,TargPos……);//该角色的本地客户端向数据库发送消息
Recved(CurPos,TargPos……);//与该玩家所在同屏列表中其他玩家的客户端
收到服务器发来的消息结构
If(IsNeedA*())//先得到要去这个目的地,是否需要A*算法
{
     直接向目标走去
}
else
{
    从新计算本地所绘制的角色的当前位置到目标位置的A*路径
     根据路径向目标走去
}

3.  因为同屏显示多个玩家角色,如果都需要进行A*的话,就必须对各个角色的A*进行需求排序,单独开辟一个A*线程来实现。

4.该算法的前提是可以在一定范围内允许不同用户的同一角色可以在不同时间内完成寻路事件。

2. 天龙八部

游戏类型:天龙八部也是一款2.5D的武侠风MMORPG类游戏。

游戏中的角色同步的分析: 首先,经过2个不同角色的分析,发现该游戏的同步具有以下几个特点:

       同样是本地客户端先行模拟

       游戏中本地客户端模拟网络玩家的运动时,网络玩家的移动速度出现了很大的变化,本地玩家角色(A)的每一次寻路操作都会引发其他能看到A的客户端(B)所绘制的A角色的移动。由此可知,该游戏是采用的目标为任务索引的方式完成同步。即玩家A每操作一次寻路,玩家B都会收到本次操作的目标,并加入任务队列中,每个移动任务都会被玩家B的客户端执行,并且以加速的方式实现在一定时间范围内的同步效果。同样,当与正确的位移信息差异过大时候,采取瞬移的方式来纠正位移。


 由上图可知:A*在执行该移动事件的时候一共所花费的时间要远小于A的时间。但是由于A*是由任务驱动的,则可知AA*所走的路程完全一致,根据V=S/T, A*得速度要小于A

 

游戏中角色所走的路线完全一致

 

从时间上来说,T1>=T1* ,并且T2>=T2*。取决于网络速度。

总结:由于该游戏采用的是尽量使S不变,而多种方法改变V的方式来实现移动同步,因此游戏画面中会出现角色速度的改变,但是被控制到一定范围内。当位置差距较大,则采用瞬移的方式维护同步。因此可确定该方法的实现思路如下

    1.该游戏采取的方式是采用了路点信息的传输来实现的。所有的寻路节点信息都由本地客户端计算出并通过服务器广播给其他客户端。减轻了其他客户端的计算负担。

    2.对于网络角色的移动模拟,在保持2个客户端移动相同的情况下,以速度补时间的方式来实现。较适用于对同步要求较高,画面流畅性较高的游戏。对于PK系统比较重要的游戏来说,位置的同步非常的关键,这也是调节手感、走位等等因素必备的条件。而采用这种方式,极大的保留了位置信息的准确性。在网络正常(不会掉包)的情况下,每一个玩家角色A的操作都会给另外的客户端上的角色A*的位置改变。极大的保留了PK系统的准确性。


    总结:对于不同的游戏需求采取不同的方式。

当对玩家某一时刻的位置要求不需要精确时,可采用方案一,优点是:客户端服务端通讯简单。缺点,角色位置定位不准确,只能保证最终位置的正确性。

当对角色某时刻的位置要求精准时,例如PK 系统要求很完善那么就需要精确的位置显示以配合玩家养成PK手感,那么就需要采用V改变的方式,可以确保在移动中的某一时刻,该方案所实现的角色的位置是较第一种方案精确的。

 

 

 

  • 大小: 10 KB
  • 大小: 3.4 KB
  • 大小: 9.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics