当前位置: 首页 > 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…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...