Actor属性同步
明确几个概念
ActorChannel(用来实现Actor同步的通道)
其中有保存对应的Actor和Actor中需要同步的Component(Component是从UObject派生)
先来关注函数
为了方便理解,此处可以把Bunch理解为接收到的数据包,有了Bunch,首先需要知道此数据是同步给哪个Object的,ProcessBunch中的如下代码来获取,
接下来还需要知道此Bunch所同步的属性属于哪个Object(可能同步的是Actor中某个Component的属性)
接着往下看,就是属性的具体处理了
而FObjectReplicator有个成员变量RepLayout来处理具体的属性复制,
在ReceivedBunch中,具体的调用代码如下:
ReceiveProperties就是具体的属性处理了。
RepLayout看名字就知道,它是一个Object中所有可复制的属性的列表,事实也是这样,保存在如下变量中
一个Bunch中同步到属性可以是多个,因此会有个属性的遍历,如下:
那复制的究竟是哪个属性呢,这里不那么直观,是通过如下class实现的
这里重点关注此类中的如下两个变量
WaitingHandle是等待处理的属性
CurrentHandle是当前正在处理的属性
这里再回头看ReadNextHandle方法
这里就很明显了,通过Bunch获取待处理的属性,再回到下图
ProcessCmds处理所有的属性,通过一些转调用,具体是通过ProcessCmds_r函数处理属性的,如下
此函数中遍历了所有的Cmds,通过如下代码来决定Cmd是否是要同步的属性
如下是ShouldProcessNextCmd的代码(此处使用了宏替换)
这里很明显,判断当前属性是否是待处理的属性,如果是,调用ProcessCmd
ProcessCmd实现如下(此处使用宏替换)
此函数也很简单,调用ReceivePropertyHelper处理某个具体的属性,通过ReadNextHandle跳到下一个属性,实现属性的遍历
最后,分析函数ReceivePropertyHelper,真正用来实现属性复制的代码
再往下,就是属性变化的回调处理了,OnRep_XXX