【UE】属性同步发送和接收源码分析

概述

UE只有Actor类有属性同步功能,Actor开启属性同步的前提是Actor的bReplicated属性为true,属性同步只有Server可以往Client同步,NetDriver类中负责发送和接收属性同步数据,在Server端每帧调用UNetDriver::TickFlush,将要同步的Actor的属性发送到所有连接的Client,在Client每帧调用UNetDriver::TickDispatch接收属性同步消息并修改对应Actor的属性

TickFlush(发送)

首先判断是Server并且客户端连接数量大于0,才会去执行ServerReplicateActors去同步属性
在这里插入图片描述
ServerReplicateActors_PrepConnections,将每个客户端连接的ViewTarget设置成PlayerController
在这里插入图片描述
构造ConsiderList数组,用于存放经过筛选后的需要复制的Actor,数组大小是用的GetNetworkObjectList().GetActiveObjects().Num(),我们看下为什么用这个设置数组大小
在这里插入图片描述
如果一个Actor打开了复制(Replicates=true),那么就会在NetDriver的NetworkObjectList中储存这个Actor,所以就解释了为什么要用这个数组的大小设置ConsiderList的大小
在这里插入图片描述
在这里插入图片描述
ServerReplicateActors_BuildConsiderList
依旧是遍历GetNetworkObjectList().GetActiveObjects()
在这里插入图片描述
然后根据一些条件对Actor进行过滤
在这里插入图片描述
这里是计算Actor的下一帧同步时间【World->TimeSeconds + UpdateDelayRandomStream.FRand() * ServerTickTime + ActorInfo->OptimalNetUpdateDelta : 1.0f / Actor->NetUpdateFrequency】
在这里插入图片描述
将需要同步的Actor加入ConsiderList中,将部分过滤掉的Actor(休眠的、远程权限为空的)从NetworkObjectList移除,下次属性复制时就不会遍历到这些过滤掉的Actor
在这里插入图片描述
遍历每一个客户端连接
在这里插入图片描述
ServerReplicateActors_PrioritizeActors
如果Actor还没有建立Channel(每个需要同步的Actor都有一个ActorChannel,用于收发同步消息),且与角色不相关(距离剔除),就跳过,这里的NetCullDistanceSequared就是Actor最大同步距离
在这里插入图片描述
还有只和Owner相关的,但当前连接不是Owner的 以及 休眠的Actor都跳过,最后对Actor按照优先级进行排序
在这里插入图片描述
ServerReplicateActors_ProcessPrioritizedActors
先遍历每个Actor,如果当前Actor没有对应的Channel,则创建一个Channel
在这里插入图片描述
去Channel的ReplicateActor执行Actor属性复制
在这里插入图片描述
如果Actor是第一次发送,则还需要包含Actor的创建信息(GUID、Actor的CDO信息),具体可见我的另一篇博文Actor第一次被创建时经历了什么
在这里插入图片描述
bWroteSomethingImportant是用来判断属性是否有变化,有变化后才会发送属性同步包在这里插入图片描述
SendBunch中先创建一个FOutBunch数组,然后添加RPC指针类型参数包在这里插入图片描述
最后遍历OutgoingBunches发送包,并记录Bunch在当前Packet中的顺序
在这里插入图片描述
发包就是调用NetConnection::FlushNet中调用LowLevelSebd方法发送的

在这里插入图片描述

TickDisPatch(接收)

待完成

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

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

相关文章

【AI视野·今日CV 计算机视觉论文速览 第279期】Tue, 31 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Tue, 31 Oct 2023 Totally 165 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers SimMMDG: A Simple and Effective Framework for Multi-modal Domain Generalization Authors Hao Dong, Ismail Nejjar, …

开源与闭源软件的辩论:对大模型技术发展的影响

目录 前言1 开源软件的优缺点1.1 开源软件的优点1.2 开源软件的缺点和挑战 2 闭源软件的优缺点2.1 闭源软件的优点2.2 闭源软件的缺点和挑战 3 大模型发展会走向哪一边结语 前言 近期,特斯拉CEO马斯克公开表示:OpenAI不该闭源,自家首款聊天机…

自建es数据迁移阿里云方案

一、ElasticSearch数据迁移方法介绍 https://help.aliyun.com/document_detail/170095.html?spma2c4g.26937906.0.0.429240c9ymiXGm 可以通过Logstash、reindex和OSS等多种方式完成阿里云Elasticsearch间数据迁移、Elasticsearch数据迁移至Openstore存储中、自建Elasticsear…

60V100V降压ic推荐

在电源降压领域,一款优秀的降压IC需要具备高效、稳定、安全、易于使用等特性。今天,我们为大家推荐一款具有9.2V至100V输入电压范围、4.5A连续输出电流、96%峰值效率、495μA工作静态电流、峰值电流模式控制、100V19mQ高边和低边MOS、固定150kHz开关频率…

如何使用选择工具

快捷键:V 你可以单击选择也可以框选多个! shift:加选 移动播放指示器 这根蓝色的线角:播放指示器 按←/→可以以按一下一帧的速度移动播放指示器 按←/→加shift可以以按一下五帧的速度移动播放指示器 按↑/↓可以让播放指…

目标检测标注工具AutoDistill

引言 在快速发展的机器学习领域,有一个方面一直保持不变:繁琐和耗时的数据标注任务。无论是用于图像分类、目标检测还是语义分割,长期以来人工标记的数据集一直是监督学习的基础。 然而,由于一个创新性的工具 AutoDistill&#x…

Python3语法总结-基本数据类型①

Python3语法总结-基本数据类型① Python3语法总结一.注释和基本数据类型标识符与关键字注释变量标准数据类型数字(Number)布尔类型(bool) 未完待续... Python3语法总结 一.注释和基本数据类型 标识符与关键字 标识符是指程序中定义的一个名字,如变量名&#xff0…

linux使用chage修改用户密码过期时间解决rac安装互信问题

文章目录 一、RAC建多实例库提示互信问题二、原因分析1.修改系统用户密码期限2.修改语法:chage [选项] 用户名3.常用示例: 一、RAC建多实例库提示互信问题 二、原因分析 因为此次是在原有集群情况下创建多个实例,其实不需要优先排查俩节点的…

什么是BT种子!磁力链接又是如何工作的?

目录 一.什么是BT?1.BT简介:1.1.BT是目前最热门的下载方式之一1.2.BT服务器是通过一种传销的方式来实现文件共享的 2.小知识:2.1.你知道吗BT下载和常规下载到底有哪些不同2.2.BT下载的灵魂:种子2.3.当下载结束后,如果未…

二元分类模型评估方法

文章目录 前言一、混淆矩阵二、准确率三、精确率&召回率四、F1分数五、ROC 曲线六、AUC(曲线下面积)七、P-R曲线类别不平衡问题中如何选择PR与ROC 八、 Python 实现代码混淆矩阵、命中率、覆盖率、F1值ROC曲线、AUC面积 指标 公式 意义 真正例 (TP)被…

PDF控件Spire.PDF for .NET【转换】演示:将PDF 转换为 HTML

由于各种原因,您可能想要将 PDF 转换为 HTML。例如,您需要在社交媒体上共享 PDF 文档或在网络上发布 PDF 内容。在本文中,您将了解如何使用Spire.PDF for .NET在 C# 和 VB.NET 中将 PDF 转换为 HTML。 Spire.Doc 是一款专门对 Word 文档进行…

Sql Server 2017主从配置之:事务日志传送

使用事务日志传送模式搭建Sql Server 2017主从同步,该模式有一定的延迟,是通过3个不同的定时任务,将主库的日志同步到从库进行恢复来实现数据库同步操作。 环境准备 两台服务器,配置都是8g2核,50g硬盘,操…