前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UE网络通信(三) 属性同步

UE网络通信(三) 属性同步

作者头像
JohnYao
发布2022-06-29 15:13:19
1.3K0
发布2022-06-29 15:13:19
举报
文章被收录于专栏:JohnYao的技术分享

序言

上一部分介绍了相关性

johnyao:UE网络通信(二) 相关性

这一部分继续介绍属性同步。首先我们看下网络同步在整个引擎Tick循环是如何运转的。

引擎的Tick循环

在UE4的DS的Tikk循环中, 关于网络同步的操作有如下:

  1. 在Tick开始时, 先处理网络收包, 主要处理客户端发过来RPC请求。
  2. 之后,会调用各Object的Tick函数。其间可能会改变某些Actor的相关性。
  3. 最后在Tick结束前,网络模块会便利所有的连接,进行相关性计算得到需要同步的列表,并进行属性同步。

可以认为属性同步发生在Tick的收尾阶段。

对于单次的网络同步,我们可以认为它是不可靠的。但UE4通信协议的重试机制,可以保证属性的最终一致性。

属性同步的设置

在Gameplay层面,我们使用UPROPERTY宏将一个UObject的属性设置为同步(Replicated)的。 同时需要实现GetLifetimeReplicatedProps函数,设置同步条件。

代码语言:javascript
复制
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遍历对象上标记为同步的属性。

结语

本文先行粗略的介绍了属性同步的过程。后续会继续完善些属性同步的机制的细节。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 序言
    • 引擎的Tick循环
      • 属性同步的设置
        • 属性同步的原生实现
        • 结语
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档