当前位置: 首页 > news >正文

UE网络同步(一) —— 一个项目入门UE网络同步之概念解释

最近在学习UE网络同步,发现了一个非常好的教程,并且附带了项目文件,这里从这个小项目入手,理解UE的网络同步

教程链接:https://www.youtube.com/watch?v=JOJP0CvpB8w
项目链接:https://github.com/awforsythe/Repsi/


文章目录

  • 项目目标
  • 网络模式
  • Actor复制
  • RPC
  • 所有权
  • Authority & Role
  • 一些tips


项目目标

首先明确下这个项目要实现什么目标,多人游戏,射击命中场景中的小球,小球会变成玩家角色对应的颜色。


网络模式

单人游戏的只需要考虑客户端的实现,而多人游戏在UE中有两种网络模式,一种是ListenServer,玩家的主机作为监听服务器,接收来自其他玩家的连接,而另一种是DedicatedServer,单独的服务器供所有玩家连接。

这里我们采用 DedicatedServer,其相较于ListenServer的好处是我们可以指在服务器端处理逻辑,而在客户端只用渲染和接收玩家输入,可以防作弊,减少客户端的处理逻辑。

可以在编辑器的下方进行选项的配置

而服务端和客户端是通过如下方式连接起来的,服务端和客户端皆有
UGameEngine -> UNetDriver,而UNetDriver下对于服务端持有对多个对客户端的连接,而每个客户端持有对一个服务端的连接,

而对于一个客户端和服务端之间的连接,其持有多个Channel对应多个要同步的对象


Actor复制

设置 Actor 的 bReplicates = true 它会在对应的 Player 连接的 Channels 中加入对应的 UActorChannel,那么客户端和服务端就会利用这个Channel来交换对应Actor的信息。

也可以在运行时设置

而 Actor 本身的生命周期由服务端控制,那么当服务端生成了一个要同步的Actor,该Actor会复制到客户端,如果服务端删除了一个 Actor,对应的客户端也要删除相应的 Actor。

而对于 Actor 属性来说,如果服务端修改了属性,那么修改后的属性会同步到客户端。C++中需要在 UPROPERTY 中加入 REPLICATED 同时在 GetLifetimeReplicateProps 增加对应实现

当然我们也可以有选择地去设置属性的复制,比如下面是跳过拥有该属性的所有权的客户端

有时候我们客户端同步属性的时候,可能不止是做简单的复制,我们可以使用 RepNotify 在复制的时候做一些其他的操作。

上面这种只会在客户端调用,我们想要在服务端也执行该函数的话,可以在服务端的执行流程中加入该函数的调用

对于 Actor 还有一个 Relevancy 属性,相关性决定了 Actor 会被复制到哪些客户端,

比如有一些 Actor(比如GameState、PlayerState)就是和所有客户端同步的,它们的 bAlwaysRelevant = true


RPC

远程过程调用(RPC) 是在本地调用但在其他机器上远程执行函数,在C++中我们可以在 UFUNCTION 中添加对应关键字就能将函数声明为RPC,可选项有:

  • Server —— 表示在服务器上执行
  • Client —— 表示在特定客户端上执行
  • NetMulticast —— 表示在所有客户端上执行

C++中的函数定义后面要加上 _Implementation 后缀。

需要注意就算是 Multicast 也需要考虑相关性,Actor 都不被这些客户端持有,当然也不能在这些客户端上调用RPC

RPC可以设置为 可靠的和非可靠的,非可靠的可以减少带宽,但可能会导致RPC丢失或者数据到达顺序不被保证,而可靠的RPC保证到达,且在同一个Actor内RPC到达顺序与调用顺序一致

Server RPC 函数声明可以在UFUNCTION 中加上 WithValidation,同时添加后缀为 _Validate 的实现,用于检测客户端传递过来的数据是否是合法的,可用于作弊检查,如果返回 false 会把客户端踢出游戏。

Server RPC 也是客户端向服务端传输数据的唯一方式。RPC会立即发送,所以适用于高优先级的网络代码,比如角色类中通过RPC传输位置。


所有权

客户端的连接拥有 Controller(每个客户端有其对应的一个Controller,也不会持有其他客户端Controller的副本),而Controller拥有PlayerState,我们可以看作连接也拥有 PlayerState,当然Controller也会拥有处理的Apawn,Apawn可能会持有Aweapon,通过所有权的设置,我们可以得到一个Actor是被哪个Player拥有(一个树形关系)

所有权(Ownership)也会影响 Relevance,比如下面这个 Actor 的所有者是 P0,且设置 bOnlyRelevantToOwner = true 那么该Actor不会被同步到未具有其所有权的客户端。

且可以通过 Owner 关系从拥有者传递相关性到被拥有者,要设置 bNetUseOwnerRelevancy=true

如果一个Actor没有设置拥有者,那么客户端未拥有这个Actor,那么默认的行为如下:

  • 如果 Actor 被隐藏且其根组件的碰撞被关闭,它不会被认为是相关的
  • 否则相关性基于与玩家的距离,如果小于设置的网络剔除距离,则被认为是与该Player相关的

    当然我们也可以在 Actor 中自定义 IsNetRelevantFor 的逻辑

Authority & Role

一个 Actor 在不同的机器上可能有不同的 Role,比如 玩家0 的机器上的角色对象本身的 Role 是 ROLE_AutonomousProxy 在服务端是 ROLE_Authority 而在其他玩家的机器上是 ROLE_SimulateProxy

我们可以根据 Role 来决定 Actor 在不同机器上的执行流程(如果是GameInstance是NM_Client且这个actor是由客户端产生,那么该Actor在产生它的客户端上的ROLE也是 Authority)而如果 GameInstance是NM_Client而这个actor由服务端产生,那么actor在这个客户端上的ROLE是非 Authority

具体地一些Actor在不同机器上的情况可以看下表

不同的Pawn在不同机器上的 IsLocallyControlled() 是不同的


一些tips

我们引入了网络同步无疑会影响我们代码的复杂性

比如单机情况下 APawn 的代码组织结构如下

而在引入网络的情况下,服务端和客户端的代码结构是不一样的,要复杂了很多

不同的Actor会位于不同的机器上(服务端 or 客户端)

我们要根据不同对Actor的不同需求,赋予他们对应的所有权,以让他们可以在不同机器上实现

相关文章:

UE网络同步(一) —— 一个项目入门UE网络同步之概念解释

最近在学习UE网络同步,发现了一个非常好的教程,并且附带了项目文件,这里从这个小项目入手,理解UE的网络同步 教程链接:https://www.youtube.com/watch?vJOJP0CvpB8w 项目链接:https://github.com/awforsyt…...

MATLAB中rsf2csf函数用法

目录 语法 说明 示例 将实数 Schur 形式变换为复数 Schur 形式 rsf2csf函数的功能是将实数 Schur 形式转换为复数 Schur 形式。 语法 [Unew,Tnew] rsf2csf(U,T) 说明 ​[Unew,Tnew] rsf2csf(U,T) 将实矩阵 X 的 [U,T] schur(X) 的输出从实数 Schur 形式变换为复数 Sc…...

Java基础 文字小游戏

souf System.out.printf("你好啊%s","张三") 输出你好啊张三 System.out.printn()放在中间可以换行 System.out.printf("%s你好啊%s","张三","李四") 输出 张三你好啊李四 只有输出没有换行效果。 制作一个文字小游戏…...

「数组」归并排序 / if语句优化|小区间插入优化(C++)

概述 在上一篇文章中,我们介绍了快速排序以及随机快速排序: 「数组」快速排序 / 随机值优化|小区间插入优化(C) 今天,我们来介绍归并排序。 相比于快速排序是冒泡排序融合了分治思想后形成的究极promax进化版&…...

颠覆传统 北大新型MoM架构挑战Transformer模型,显著提升计算效率

挑战传统的Transformer模型设计 在深度学习和自然语言处理领域,Transformer模型已经成为一种标准的架构,广泛应用于各种任务中。传统的Transformer模型依赖于一个固定的、按深度排序的层次结构,每一层的输出都作为下一层的输入。这种设计虽然…...

接口优化笔记

索引 添加索引 where条件的关键自动或者order by后面的排序字段可以添加索引加速查询 索引只能通过删除新增进行修改,无法直接修改。 # 查看表的索引 show index from table_name; show create table table_name; # 添加索引 alter table table_name add index …...

pandas 科学计数法显示

我注意到pandas中有一个问题, 默认情况下,就是其中的数据的小数位不能超过6位,比如0.0000007就会被显示为0,这个结果如下 全部以科学技术显示 import pandas as pd import numpy as np# 设置显示格式为科学计数法 pd.options.d…...

PHP正则替换字符串中的图片地址

在PHP中&#xff0c;可以使用preg_replace()函数来实现正则表达式的替换功能。以下是一个简单的例子&#xff0c;演示如何替换字符串中的图片地址。 double $str 图片地址1&#xff1a;<img src"http://example.com/image1.jpg"> 图片地址2&#xff1a;<i…...

基于多商户AI智能名片商城小程序的粉丝忠诚度提升策略:深度融合足额法则与多维度激励体系

摘要&#xff1a;在数字化浪潮的推动下&#xff0c;多商户AI智能名片商城小程序以其独特的商业模式和技术优势&#xff0c;正逐步成为连接商家与消费者&#xff0c;特别是粉丝群体的重要平台。本文深入探讨了如何通过深度融合足额法则与多维度激励体系&#xff0c;有效提升多商…...

BigDecimal高精度运算

1. BigDecimal是什么类型&#xff0c;为什么可以转为double BigDecimal 是 Java 中用于表示任意精度的十进制数的类。它主要用于金融和商业计算&#xff0c;能够提供比 double 类型更高精度的运算&#xff0c;特别是在处理货币等需要精确计算的场景中。 1.1 BigDecimal 的基…...

C/C++实现蓝屏2.0

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 前…...

Unity音频管理器插件AudioToolKit

Unity音频管理器插件AudioToolKit 介绍AudioToolKit介绍具体用法总结 介绍 最近在自己写音频管理器的时候在网上发现了一款比较好用并且功能很全的一个音频管理插件&#xff0c;叫做AudioToolKit的插件。 如果需要的可以直接从我资源中找AudioToolKit。 AudioToolKit介绍 A…...

搜维尔科技:驾驶模拟器背后的技术: Varjo的虚拟/混合现实 (VR/XR)提供独特的优势,最终加快汽车开发创新的步伐

专业驾驶模拟器广泛应用于车辆开发&#xff0c;帮助汽车行业在开发过程的早期做出更好的设计决策。总体目标是为测试驾驶员提供最真实的驾驶体验&#xff0c;包括动态动作和声音&#xff0c;并测试控制算法或辅助系统等功能。环境越真实&#xff0c;驾驶员的体验就越接近最终车…...

OSL 冠名赞助Web3峰会 “FORESIGHT2024”圆满收官

OSL 望为香港数字资产市场发展建设添砖加瓦 &#xff08;香港&#xff0c;2024 年 8 月 13 日&#xff09;- 8 月 11 日至 12 日&#xff0c; 由 香港唯一专注数字资产的上市公司 OSL 集团&#xff08;863.HK&#xff09;冠名赞助&#xff0c;Foresight News、 Foresight Ventu…...

LeetCode 3148.矩阵中的最大得分:每个元素与其左或上元素之差的最大值(原地修改O(1)空间)

【LetMeFly】3148.矩阵中的最大得分&#xff1a;每个元素与其左或上元素之差的最大值&#xff08;原地修改O(1)空间&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-difference-score-in-a-grid/ 给你一个由 正整数 组成、大小为 m x n 的矩阵 g…...

主流的开源大型语言模型

本期我们来聊聊目前主流的开源大型语言模型。这些模型就像是AI界的超级英雄&#xff0c;各具特色&#xff0c;为我们的研究和开发提供了强大的力量。&#x1f680; GPT-Neo&#xff1a;这是EleutherAI的杰作&#xff0c;它模仿了OpenAI的GPT-3。GPT-Neo虽然规模小一些&#xf…...

【自动驾驶】话题通信

目录 构建发布者构建订阅者编写lanch文件自动启动节点测试运行ROS的目录结构 切换到工作空间的src目录下&#xff1a; 构建发布者 catkin_create_pkg publisher std_msgs rospy roscpp编写发布者程序&#xff1a; // 1.包含头文件 #include "ros/ros.h" #include &…...

【Linux】中的软件安装:深入探索RPM、SRPM与YUM

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Linux的起源与发展 2、RPM、SRPM与YUM的简要介…...

uniapp自定义请求头信息header

添加请求头&#xff1a;uniapp自定义请求头信息header&#xff0c;如下&#xff1a;添加tenant-id参数 代码...

SpringBoot整合Liquibase

1、是什么&#xff1f; Liquibase官网 Liquibase是一个开源的数据库管理工具&#xff0c;可以帮助开发人员管理和跟踪数据库变更。它可以与各种关系型数据库和NoSQL数据库一起使用&#xff0c;并提供多种数据库任务自动化功能&#xff0c;例如数据库迁移、版本控制和监控。Li…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...