上一部分介绍了相关性
这一部分继续介绍属性同步。首先我们看下网络同步在整个引擎Tick循环是如何运转的。
在UE4的DS的Tikk循环中, 关于网络同步的操作有如下:
可以认为属性同步发生在Tick的收尾阶段。
对于单次的网络同步,我们可以认为它是不可靠的。但UE4通信协议的重试机制,可以保证属性的最终一致性。
在Gameplay层面,我们使用UPROPERTY宏将一个UObject的属性设置为同步(Replicated)的。 同时需要实现GetLifetimeReplicatedProps函数,设置同步条件。
UCLASS(Blueprintable)
class AYourActor {
GENERATED_BODY()
public:
UPROPERTY(Replicated, ReplicatedUsing = OnRep_DoorState)
uint32 YourProperty = 0;
};
void AYourActor::GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const {
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION(AYourActor, YourProperty, COND_SimulatedOnly);
}
属性同步主要用到了如下类
每个Actor会有一个FReplicationChangelistMgr,记录了每帧的变化历史。 如果Actor和某个Connection相关,则会有一个对应UActorChannel,组成该Actor的需要同步的UObject会由这个相关Connection创建一个对应的FObjectReplicator。
属性对比的过程,就是遍历所有连接。 每个连接遍历所有的Channel,每个Channel遍历所有的ObjectReplicator。 每个ObjectReplicator会利用Replayout遍历对象上标记为同步的属性。
本文先行粗略的介绍了属性同步的过程。后续会继续完善些属性同步的机制的细节。