ue4 Actor屬性同步流程

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章