kbengine移动同步分析

时间:2024-03-16 08:02:09

在kbengine.cs中,可以看到存在这样一个函数

kbengine移动同步分析

在1394行 可以看到会调用baseapp::onUpdateDataFromClient()

kbengine移动同步分析

 

4618行调用了cellapp:: onUpdateDataFromClient()

从baseapp:: onUpdateDataFromClient()到cellapp:: onUpdateDataFromClient()

kbengine移动同步分析

 

1502行实际上调用了Entity:: onUpdateDataFromClient()

kbengine移动同步分析

下面还有一长段检查就没截图了。走到这发现好像就是更新了位置,AOI没有处理啊。实际上这里隐蔽在于要到position函数里

kbengine移动同步分析

kbengine移动同步分析

 

 

2017行进到EntityCoordinateNode:: update()

kbengine移动同步分析

355行到CoordinateNode::update()

kbengine移动同步分析

会在52行到coordinateSystem::update()

kbengine移动同步分析

这里注意的是moveNodeX这个函数,后面的y,z都是相似的。主要看的是moveNodeX的后半段,以下是moveNodeX的后半段

kbengine移动同步分析

看到这有onNodePassX(),查找到coordinate_node.h

 

kbengine移动同步分析

kbengine移动同步分析

然后你会发现coordinate_node.h关于onNodePassX()啥都没有,好在它们是虚函数。所以就要看coordinate_node的继承类。

 

kbengine移动同步分析

这就是它们几个关联类之间的关系

在coordinateNode的继承类中找啊找,发现在RangeTriggerNode类有重写onNodePassX(),进去查看

kbengine移动同步分析

 

原来最后的实现用的是RangeTrigger:: onNodePassX,

kbengine移动同步分析

 

这里先不管判断逻辑,反正最后要不什么都没发生,直接return,要么执行onEnter或者onLeave

kbengine移动同步分析

 

发现在RangeTrigger里onEnter和onLeave是纯虚函数,又要查看其子类

kbengine移动同步分析

 

先看viewTrigger的onEnter

kbengine移动同步分析

 

这里会发现最后会调用witness的onEnterView()

kbengine移动同步分析

kbengine移动同步分析

witness的onEnterView()就是处理AOI的

 

AOI在服务端处理处理好了,那么客户端是怎么知道呢?

找了半天,也没找到

 

后来又结合前面login过程想,突然惊醒,就是计时器啊,handleTimeout。

kbengine移动同步分析

kbengine移动同步分析

kbengine移动同步分析

 

理清这个关系,就是cellapp::handleTimeout -> EntityApp<Entity>::handleTimeout -> cellapp::handleGameTick

 

主要看cellapp::handleGameTick,其中

1、UpdateLoad() 是更新cellapp上的负载情况

2、SpaceMemorys::update()是用来更新space的memory情况

 

那么updatables_.update()是干什么呢?首先就要明白updatables_是什么,updatables是updatable的集合,updatables_.update()就是对集合中的每一个updatable进行update操作

kbengine移动同步分析

 

那么updatable的update是干啥呢

 

kbengine移动同步分析

 

它是一个纯虚函数,那么具体实现肯定要找到它的子类了。

走到这,就要猜一猜了。现在和AOI有关系就那么几个类,前面是走到witness的onEnterView断了,就看看witness类。

果不其然

Witness继承了updatable。再看看其对update()的实现

(截取了一部分)

 

kbengine移动同步分析

看其中的for循环中的if,else if

witness是用来监视拥有者玩家内的视野范围的玩家(AOI),负责同步视野范围其他玩家的客户端数据及位置信息。有三种状态1、(将要进入视野范围内):其他玩家进入拥有者玩家的视野范围,那么将其他玩家在拥有者玩家的Witness里的引用的状态更改成普通状态,并同步其他玩家的客户端信息与位置信息给拥有者玩家,通知拥有者玩家有其他玩家进入视野范围

2、(将要离开视野范围内):其他玩家离开拥有者玩家的视野范围,那么通知拥有者玩家有其他玩家要离开,并删除其他玩家在拥有者玩家的Witness里的引用

3、(普通状态,还在视野范围内),同步还在视野范围的其他玩家的信息给拥有者玩家

在update中会不断的将这些信息传递给客户端