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

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: 服务器端的控制权,具有最高权限。

相关文章:

  • excel导出图片---HSSFWorkbook--SXSSFWorkbook
  • <Rust>iced库(0.13.1)学习之部件(三十):button部件的使用
  • 为什么vue加载select大量数据会使页面造成卡顿
  • upsample nearest 临近上采样实现方式
  • taobao.item_get_appAPI接口原app数据测试指南
  • unity安装报错问题记录
  • 确保从IP池提取的IP是可用的对于数据抓取或其他网络活动至关重要。以下是一些确保IP可用性的有效方法:
  • 点评项目-3-登录成功后加载登录页面
  • Qt 每日面试题 -6
  • LVS+keepalived整合负载均衡配置
  • 物理学基础精解【41】
  • MySql中索引失效的情况及原因
  • CSS开发全攻略
  • ubuntu2204操作系统使用可执行文件方式安装docker-compose记录
  • Qt网络编程——QUdpSocket
  • JavaScript-如何实现克隆(clone)函数
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Android开源项目规范总结
  • ES6 学习笔记(一)let,const和解构赋值
  • Intervention/image 图片处理扩展包的安装和使用
  • Just for fun——迅速写完快速排序
  • PHP 小技巧
  • python docx文档转html页面
  • socket.io+express实现聊天室的思考(三)
  • Spark学习笔记之相关记录
  • SpiderData 2019年2月23日 DApp数据排行榜
  • STAR法则
  • 阿里云前端周刊 - 第 26 期
  • 浮动相关
  • 关于springcloud Gateway中的限流
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 时间复杂度与空间复杂度分析
  • 跳前端坑前,先看看这个!!
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • Prometheus VS InfluxDB
  • 阿里云ACE认证学习知识点梳理
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # 飞书APP集成平台-数字化落地
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #HarmonyOS:基础语法
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (07)Hive——窗口函数详解
  • (1)Android开发优化---------UI优化
  • (C)一些题4
  • (LLM) 很笨
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (WSI分类)WSI分类文献小综述 2024
  • (第30天)二叉树阶段总结