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