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

UE(网络)

网络

前提:

联机模式和单机模式不同,单机模式仅考虑架构设计和逻辑问题,联网则需要考虑每个数据存放的 位置,以便在客户端或服务器正确交互通信存储,

由于联网的设计细节有很大不同,一些单机模式的设计在联网中并不适合,所以游戏开发前首先要确定是否联网,然后才开始支持联网的具体设计

数据规则:

网络模式下,为了所有玩家提供一致的体验,我们要考虑每一个数据,生成位置,复制方式等,同时还要最大限度减少信息复制量,避免网络带宽频繁饱和

遵守一下规则:

服务器是权威的,保存大部分数据(以便和所有客户端通信),重要数据(防止作弊)

客户端负责渲染(图形和音频),和保存非重要数据(不必传给服务器,因为消耗性能)

通信方式:

  • 客户端数据不通信
  • 客户端数据传给服务器
  • 服务器数据传给某个(仅一个玩家渲染)/多个(多个玩家渲染)/所有(所有玩家看到一致的画面)客户端

客户端间不能彼此通信,如果想要通知其他客户端,首先需要通知服务器,再由服务器通知指定客户端
我们可以将事件函数设置为rpc,让事件在哪执行,但本质也是更改内部数据的位置

我们必须清楚每个数据的位置,否则容易访问不到

网络延迟,服务器到客户端彼此通信容易出现丢包,因此应检查是否数据正确传输,可以直接通过添加引脚

只有在服务器生成的,才能PRC Server

内置数据生成位置

参考文章

ue内置会自动同步一些模块,因此我们需要清楚在属于谁

player controller 每个玩家有一份,服务器有一份,客户端有一份

pawn / character,最开始属于服务器,会按照客户端数量创建,是Replicated,因此会渲染到每个客户端,但是因为自己的那份会和player controller绑定,因此属于本地客户端,其他不属于的仅仅在本地渲染

widget,不重要数据,仅在本地

actor,具体考虑生成位置,默认在服务器,手动生成则看具体生成位置

……

会话模式:

  1. 单机:NM_Standalone主机需要同时运行服务器端和客户端逻辑
  2. 专用服务器:NM_Dedicated没有本地玩家的服务器(常用于需要更持久、安全或大规模多玩家的游戏)成本更高,更难配置。专用服务器需要独立于所有游戏参与玩家的计算机  ,这样更能保证公平性。
  3. 监听服务器:NM_ListenServer有一个本地玩家,此玩家负责托管游戏(常用于临时合作和竞技多人游戏。) 以简单易用为设计出发点,可供用户自发进行设置,可供网络上的其他玩家链接。(可能引发游戏公平性的问题)
  4. 客户端:NM_Client连接到远程服务器的客户端(服务器看不到,所有窗口都是客户端)。

(一)服务器->客户端复制

客户端通信:

Replicated 为属性复制提供了指定特定条件的选项,可以设置自定义复制条件

Replicated Using为属性提供函数,当属性被复制时,客户端就会调用该函数。

NotReplicated 通常用于struct中

使用Replicated 

  1. Replicated 声明属性为可复制
  2. 构造函数中 bReplicates = true;表示此actor可以被复制
  3. 网络复制 && 配置属性的复制方式:

Super::GetLifetimeReplicatedPropsTArray<FLifetimeProperty>&存储所有 要复制的属性)复制属性

复制宏:DOREPLIFETIMEAclass,属性name)当发生更改,会将值复制到所有客户端 doreplifetime)属性元数据说明符服务器会在复制的属性每次更改其值时向每个连接 的客户端发送更新。

使用Replicated Using

  1. ReplicatedUsing = OnRep_funcname

复制条件 &复制宏:更精细地控制属性的复制GetLifetimeReplicatedProps方式:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/replicate-actor-properties-in-unreal-engine#%E6%B7%BB%E5%8A%A0%E5%A4%8D%E5%88%B6%E7%9A%84%E5%B1%9E%E6%80%A7

DOREPLIFETIME_CONDITIONAclass,属性name,复制条件(复制到哪些连接))但不会自动调用任何通知函数。

DOREPLIFETIME_CONDITION_NOTIFYAclass,属性name,复制条件,REPNOTIFY_Always在每次复制属性时调用OnRep_||REPNOTIFY_OnChanged仅在属性更改时调用OnRep_)会在属性的值发生变化时自动调用指定的通知函数。

(二)客户端<->服务端通信:

RPC(Remote Procedure Call)远程程序调用

用于在网络游戏中进行客户端和服务器之间的通信,从一台计算机调用函数,并在不同的计算机上运行它

·  Server:由客户端调用并在服务器上执行。

·  Client:由服务器调用并在特定客户端上执行。

·  Multicast:由服务器调用并在所有客户端上执行。

声明函数:UFUNCTION(……, Reliable):

  1. Server客户端上调用、但需要在服务器上执行
  2. Client 在服务器上调用、但需要在客户端上执行
  3. NetMulticast多播: 从服务器调用,所有客户端上执行

C++API

IsLocallyControlled()是否是客户端

GetLocalRole()  == enum  返回的是当前对象在本地机器上的角色类型,用于区分当前是客户端还是服务器

·  0ROLE_None: 没有分配角色。

·  1ROLE_SimulatedProxy: 客户端的模拟代理,不是权威版本。

·  2ROLE_AutonomousProxy: 客户端的自主代理,客户端拥有控制权

·  3ROLE_Authority: 服务器端的控制权,具有最高权限。


http://www.kler.cn/news/328016.html

相关文章:

  • 基于Node.js+Express+MySQL+VUE科研成果网站发布查看科研信息科研成果论文下载免费安装部署
  • cf 975 div2 C(结论)E (树+思维)
  • 避免学术欺诈!在ChatGPT帮助下实现严格引用并避免抄袭
  • UE4_Niagara基础实例—6、蓝图与粒子系统的通信
  • Linux下的驱动开发一
  • 【无人机设计与技术】四旋翼无人机的建模
  • 舵机在无人机中的应用
  • Reactor 反应堆模式
  • 一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)
  • 鸿蒙开发(NEXT/API 12)【硬件(注册智慧出行连接状态的监听)】车载系统
  • 咸鱼sign逆向分析与爬虫实现
  • IvorySQL 3.4:如何实现兼容Oracle风格的序列功能?
  • PHP爬虫APP程序:打造智能化数据抓取工具
  • 人工智能与机器学习原理精解【27】
  • Web APIs 6:正则表达式
  • AutoSar 通信服务架构,CAN通信诊断详解
  • 阿里云云效多个ssh密钥对配置
  • Python 在Excel中创建、更新和删除数据透视表
  • Kubernetes从零到精通(15-安全)
  • 【U8+】安装用友U8+16.5后,应用服务管理中缺少加密服务。
  • MySQL | DATE_ADD()函数
  • 从 ElasticSearch 中删除数据的几种方式
  • QT 获取视频帧Opencv获取清晰度
  • Git忽略规则原理和.gitignore文件不生效的原因和解决办法
  • php email功能实现:详细步骤与配置技巧?
  • 虚拟机、ubantu不能连接网络,解决办法
  • 并发面试合集
  • 前缀和(7)_连续数组
  • 安全教育培训小程序系统开发制作方案
  • Thinkphp/Laravel小型超市进销存管理系统的设计与实现