【UE】属性同步,源码详解一个勾选了Actor复制的Actor第一次被创建时经历了什么

本文参考https://zhuanlan.zhihu.com/p/640723352

准备工作

先准备一个勾选了复制的Actor,然后在游戏开始时Spawn这个Actor
在这里插入图片描述
在这里插入图片描述

源码过程详解

发送属性同步

在NetDriver的TickFlush中发送属性同步的数据
1、ServerReplicateActors_BuildConsiderList 去找到所有需要属性同步的Actor,并根据一些规则过滤掉一部分
2、ServerReplicateActors_PrioritizeActors 按照优先级对Actor进行排序,不可靠的RPC也会被添加到需要发送的Actor数组末尾
3、ServerReplicateActors_ProcessPrioritizedActors 遍历每个需要发送的Actor
这里就可以找到我们的Actor
在这里插入图片描述
因为是第一次属性同步的数据,所以这个Actor还没有Channel,就会走到这里的创建Channel的逻辑
Channel就是通道,每个网络复制的Actor都有一个,服务端通过Channel将属性同步的数据发送到客户端
在这里插入图片描述
然后走到Channel->ReplicateActor()去执行这个通道的属性同步的操作
在这里插入图片描述
第一次属性同步会走到PackageMapClient类的SerializeNewActor,这里的Connection就是客户端连接。
PackageMap每个Server和Client都会有一个,该对象负责Actor和NetworkGUID的双向映射,以及序列化一个Object。
在这里插入图片描述
然后走到SerializeObject
在这里插入图片描述
调用InternalWriteObject将NetGUID写入到Bunch中,如果有PathName也会一起写入到Bunch中
在这里插入图片描述
NetGUID是一个结构体,是网络复制Actor的唯一标识符,用于复制时判断是否为相同的Actor,如果有PathName就根据PathName判断,没有PathName就根据Value判断,PathName就是Actor的路径 + 编号
在这里插入图片描述
在这里插入图片描述
Archetype:Actor的CDO信息
ActorLevel:Actor所属关卡,同步接受时是根据Level来找Actor的
Location、Scale、Velocity、Rotation这几个Actor属性
在这里插入图片描述
无论在服务器还是客户端,CDO的路径是固定的,只和资源路径有关,与World无关。
比如在Game目录下创建了一个蓝图类,那么它的CDO路径为/Game/TestActor.Default__TestActor_C
如果是C++类,那路径更加毫无疑问是一致的。
我们序列化CDO,只要序列化其路径即可,而且UE把所有UObject的网络同步都交给UPackageMapClient统一管理,CDO也有NetworkGUID,只有第一次同步时需要同步路径,后面都同步NetworkGUID,我们先都考虑第一次同步情况。
具体逻辑通过ExportNetGUID函数实现,它会写入<NetworGUID, path>对应关系,客户端收到后能在本地也建立起这个关系。如果Object有Outer,也要对Outer执行同样操作,把Outer关系也发送给客户端。
通过ExportNetGUID生产的序列化数据后续会被写入bunch前部,相对于把Object和GUID的映射先告诉客户端,客户端在处理后续Bunch时碰到对应NetworkGUID,就知道是哪个Object了。

匿名函数ConditionallySerializeQuantizedVector将Location、Rotation等属性序列化到Bunch中
在这里插入图片描述
在这里插入图片描述
然后去发送属性同步Packet
在这里插入图片描述

接收属性同步

堆栈
在这里插入图片描述
1、是Actor的第一次属性同步,所以接收时客户端还没有这个Actor
也是这六个属性
在这里插入图片描述
SerializeObject去序列化Actor数据到Archetype
在这里插入图片描述
读取到ActorLevel、Location、Rotation等信息
在这里插入图片描述
在这里插入图片描述
如果Actor为空,Archetype(CDO)不为空,就去生成Actor,并附带位置、旋转、所在关卡等信息
在这里插入图片描述
如果Actor生成成功再去添加速度、缩放属性
在这里插入图片描述
去客户端注册这个Actor,也就是去ObjectLookup数组中添加这个Actor,下一次再有属性同步数据时就可以找到这个Actor了
在这里插入图片描述
如果是新生成的Actor执行PostNetInit(),去执行Actor的BeginPlay
在这里插入图片描述
在这里插入图片描述
至此一个Actor的第一次属性复制的流程结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/155086.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ pcl 选取点云某一点反馈XYZ坐标的代码

看了看以前的代码&#xff0c;有一小段代码很有意思&#xff0c;是关于pcl点云处理的。 如有帮助&#xff0c;点赞收藏关注&#xff01;&#xff01;&#xff01; 读取点云数据&#xff0c;想可视化点云数据&#xff0c;并根据选择&#xff0c;实时显示点云的空间坐标数值。 接…

线扫相机DALSA--采集卡Base模式设置

采集卡默认加载“1 X Full Camera Link”固件&#xff0c;Base模式首先要将固件更新为“2 X Base Camera Link”。 右键SCI图标&#xff0c;选择“打开文件所在的位置”&#xff0c;找到并打开SciDalsaConfig的Demo&#xff0c;如上图所示&#xff1a; 左键单击“获取相机”&a…

mysql之语句

1、mysql的扩展语句 &#xff08;1&#xff09;创建表 if not exists yyy&#xff1a;这个表不存在才会创建 zerofill&#xff1a;自动补齐位置 primary key&#xff1a;当前表的主键&#xff0c;主键只能有一个&#xff0c;唯一且不能为空 auto_increment&#xff1a;表示…

AI:43-基于深度学习的昆虫图像识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

Python爬虫程序中的504错误:原因、常见场景和解决方法

概述 在编写Python爬虫程序时&#xff0c;我们经常会遇到各种错误和异常。其中&#xff0c;504错误是一种常见的网络错误&#xff0c;它表示网关超时。是指客户端与服务器之间的网关通信过程中&#xff0c;服务器在规定的时间内没有返回响应&#xff0c;导致请求超时。此类错误…

学习Bootstrap 5的第十九天

目录 范围 自定义范围 步进 最小值和最大值 输入框组 输入组 输入组大小 带复选框和单选框的输入组 输入组按钮 带下拉按钮的输入组 输入框组标签 范围 自定义范围 可以通过将.form-range类添加到type"range"的输入元素来自定义范围菜单的样式。 要创建…

ios 代码上下文截屏之后导致的图片异常问题

业务场景&#xff0c;之前是直接将当前的collectionview截长屏操作&#xff0c;第一次截图会出现黑色部分原因是视图未完全布局&#xff0c;原因是第一次使用了Masonry约束然后再截图的时候进行了frame赋值&#xff0c;可以查看下Masonry约束和frame的冲突&#xff0c;全部修改…

卷积模型的Memory, Params, Flop是如何计算的?

文章目录 图片中的卷积的memory, params, flop是怎么计算的呢&#xff1f;MemoryParamsFlop池化层 图片中的卷积的memory, params, flop是怎么计算的呢&#xff1f; Memory 内存&#xff1a;存储每一层输出的元素 C * H * W 64 * 56 * 56 200704 个元素 有200704个元素&am…

【HTML/CSS学习】margin和padding的区别

1. margin margin&#xff08;外边距&#xff09;属性定义元素周围的空间。 margin主要在元素的外部创建空白区域&#xff0c;用于分隔元素与其相邻元素之间的距离。 用处&#xff1a;可以用于调整两个元素之间的间隔。 2. padding padding&#xff08;填充&#xff09;定义…

微信开放平台账号

微信开放平台账号是用于注册APP端用的微信分享、登陆、支付等功能接口的账号&#xff0c;在制作APP的过程中非常重要。通过微信开放平台&#xff0c;开发者可以接入微信支付、微信登录等功能&#xff0c;从而为APP提供更多样化的服务。 微信开放平台账号管理权限包括创建开放平…

在pycharm中,远程操作服务器上的jupyter notebook

一、使用场景 现在我们有两台电脑&#xff0c;一台是拥有高算力的服务器&#xff0c;另一台是普通的轻薄笔记本电脑。如何在服务器上运行jupyter notebook&#xff0c;同时映射到笔记本电脑上的pycharm客户端中进行操作呢&#xff1f; 二、软件 pycharm专业版&#xff0c;jupy…

SpringSecurity6 | HelloWorld入门案例

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…