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

news2024/11/16 1:30:54

最近在学习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的不同需求,赋予他们对应的所有权,以让他们可以在不同机器上实现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机内存映射

在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM。在对于 RAM 紧缺的嵌入式系统中,是缺少 MMU 内存管理单元的。 因此在一些嵌入式系统中,比如常用…

Python 设计模式之适配者模式

文章目录 从电源适配器谈起实现适配器模式的两种方式object adapterclass adapter 从电源适配器谈起 适配者模式属于结构型设计模式,它的目的是使不兼容的两个对象能够相互工作。 常见的生活例子:去欧美国家旅游时,由于插口和电压不一样&am…

2024年【四川省安全员B证】新版试题及四川省安全员B证模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 四川省安全员B证新版试题是安全生产模拟考试一点通总题库中生成的一套四川省安全员B证模拟考试,安全生产模拟考试一点通上四川省安全员B证作业手机同步练习。2024年【四川省安全员B证】新版试题及四川省安…

苍穹外卖项目DAY01

苍穹外卖项目Day01 1、软件开发整体介绍 1.1、软件开发流程 1.2、角色分工 项目经理:对整个项目负责,任务分配、把控进度产品经理:进行需求调研,输出需求调研文档、产品原型等UI设计师:根据产品原型输出界面效果图架…

第130天:内网安全-横向移动PTH哈希PTT 票据PTK密匙Kerberos密码喷射

环境搭建 这里这个环境继续上一篇文章搭建的环境 案例一:域横向移动-PTH-Mimikatz&NTLM 什么是pth? PTH Pass The Hash ,通过密码散列值 ( 通常是 NTLM Hash) 来进行攻击。在域环境中,用户登录计算机时使用的域账号&…

Linux_Shell判断循环,函数实例,状态码-07

一:分支语句 结束语句等于开始语句得单词反着写 1.1 if语句 if 表达式 then逻辑处理 elif 表达式 then逻辑处理 else逻辑处理 fi 1.1.1 单支语句 1.1.2 双分支语句 1.1.3 多分支语句 1.2 case条件结构语句 1.2.1 case语法结构 case 表达式 in 值) ;; esac 1.2…

Redis14-缓存同步

目录 缓存同步策略 安装Canal 监听Canal 缓存同步策略 缓存数据同步的常见方式有三种: 1.设置有效期:给缓存设置有效期,到期后自动删除,再次查询时更新 优势:简单、方便缺点:时效性差,缓存…

【CPP】CPP的STL(前篇)

目录 12 STL(前篇)12.1 什么是STL12.2 string类12.2.1 什么是string12.2.2 string类的构造函数12.2.3 string类的析构函数12.2.4 string类的[]重载12.2.5 string类的迭代器的简单了解12.2.6 auto关键字12.2.7 范围for12.2.8 反向迭代器 -- reverse12.2.9 const迭代器12.2.10 CP…

superset定制化配置修改总结

1.需要想用iframe引入dashboard时, URL 参数可用于修改仪表板的呈现方式,standalone0 属性枚举描述standalone0仪表盘正常显示1顶部导航已隐藏2顶部导航 标题被隐藏3顶部导航 标题 顶级标签被隐藏show_filters0渲染没有过滤栏的仪表板1(默…

深度学习 —— 个人学习笔记16(目标检测和边界框、目标检测数据集)

声明 本文章为个人学习使用,版面观感若有不适请谅解,文中知识仅代表个人观点,若出现错误,欢迎各位批评指正。 三十二、目标检测和边界框 import torch import matplotlib.pyplot as plt from matplotlib_inline import backend_…

Python爬虫开发:BeautifulSoup、Scrapy入门

在现代网络开发中,网络爬虫是一个非常重要的工具。它可以自动化地从网页中提取数据,并且可以用于各种用途,如数据收集、信息聚合和内容监控等。在Python中,有多个库可以用于爬虫开发,其中BeautifulSoup和Scrapy是两个非…

CVE-2024-38077:Windows远程桌面授权服务的‘隐形杀手’——深度剖析与紧急防护策略

文章目录 CVE-2024-38077:Windows远程桌面授权服务的‘隐形杀手’——深度剖析与紧急防护策略1 漏洞描述2 漏洞影响2.1 处置优先级:高2.2 影响版本 3 漏洞检测3.1 漏洞检测工具3.2 漏洞检测工具使用介绍3.2.1 漏洞检测工具当前支持三种方式检测3.2.2 漏洞…

常见的三个事务问题(脏读/幻读/不可重复读)

常见的三个事务问题(脏读/幻读/不可重复读) 脏读 脏读(Dirty Read)是指在一个事务中,读取了另一个未提交事务的数据。 具体来说,脏读的过程如下: 1. 事务A开始,对某一行数据进行…

C++学习笔记之数组

C学习笔记之数组 https://www.runoob.com/cplusplus/cpp-arrays.html C当中,数组是用于存储固定大小的相同类型元素的顺序集合 数组是整体作为一个变量,其中又包含多个单独变量,作为其元素,如数组变量a,其包含a[0]~a[…

html+css+js网页制作 淘宝首页1个页面带js

htmlcssjs网页制作 淘宝首页1个页面带js 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&…

【并查集、树的直径】P2195 HXY造公园 题解

题意 P2195 codeforces 455c,两道一样的题 给出一个由 n n n 个点, m m m 条边组成的森林,有 q q q 组询问,每次询问有以下两种情况 输入 o p 1 op 1 op1 时:给出点 x x x,输出点 x x x 所在的树的直径。 输…

千元不到,作为可穿戴AI设备,AI Friend真的能够取代手机吗?

在人工智能的浪潮中,我们见证了无数旨在提高效率和生产力的创新设备。 然而,Friend设备以其独特的设计理念,为AI设备带来了新的定义——一个永远在线的伴侣,一个情感的稳定器。 一、Friend的设计理念 Friend设备的设计初衷并非追…

vscode的C/C++环境配置和调试技巧

目录 1.背景 2.下载编译器 3.配置环境变量 4.安装C/C插件 5.写C语言代码并且编译成功 5.1文件操作 5.2对于两个窗口的解释 5.3C语言编译环境配置 6.创建执行文件 7.编译运行过程 8.写其他的代码的解决方案一 9.写其他的代码的解决方案二 10.同时编译多个.c文件 10…

Qt 中实现异步散列器

【写在前面】 在很多工作中,我们需要计算数据或者文件的散列值,例如登录或下载文件。 而在 Qt 中,负责这项工作的类为 QCryptographicHash。 关于 QCryptographicHash: QCryptographicHash 是 Qt 框架中提供的一个用于生成加密散列…

【系统维护】Dll文件修复工具使用教程,Windows系统必备!

一、dll文件是什么 dll文件是是一种Windows操作系统下的可执行文件格式,包含可由多个程序同时使用的代码和数据的文件,它的主要作用是实现代码和数据的共享,从而节省内存和硬盘空间,并提高程序的性能和可维护性 二、如何解决dll文…