草庐IT

UE4网络同步

伊蕾娜^_^ 2023-04-04 原文

Actor是UE网络同步核心。所有的数据同步都是围绕Actor展开的。服务器将保留一份Actor列表并定期更新客户端,以便客户端保留每个Actor(那些需要被同步的Actor)的近似复本。(比如:玩家角色,武器等)

Actor主要通过两种方式进行更新: 属性复制 和 RPC(远程过程调用)

如此设计的原因是,如果按照协议模式开发,客户端和服务器架构不一样,负责人不一样,导致两边的逻辑各有一份代码,一边逻辑改动需要另一边的开发人员也配合做相应的修改。同时测试起来也很麻烦。UE的基于Actor为基础的同步方式是为了方便开发,便于维护。一块逻辑可以由一个人负责客户端和服务器全部代码。开发者只要考虑新的Actor哪些需要用RPC,哪些需要用属性复制就可以了。又因为提供PIE模式,客户端和服务器逻辑可以同时运行,更能方便调试。打包时可以直接把客户端打包成APP,Server端打包成Linux服务器。

开发过程中代码上要能区分是服务器或者客户端还是模拟端。一般情况使用权威、主控或者模拟权限来确保代码在什么地方运行。对于两个客户端A和B,可以让其中一个作为监听服务器,另一个作为单纯客户端,也可以两者都是客户端,然后开发一个专有服务器。这两种情况在实际开发中都有使用,视具体情况而定。但总之,只要是Server那它就具有“权威”属性,在C++代码中可以用HasAuthority()来判断。对于一个客户端A,其权限即为“主控”,对于它来说,其他的客户端权限即为“模拟”,C++代码中可以使用IsLocallyControlled() 判断是否为本地客户端。

如若需要Actor具有同步功能,需要在该Actor蓝图中勾选Replicates属性,如下图所示:

C++代码中使用 bReplicated = true;

属性复制

需要具备同步功能的变量,可以通过设置其Replication来实现。

None即为不复制,该变量不具备同步功能。

Replicated为复制,该变量的值会被服务器同步到客户端,在各个客户端保持相同的值(C++中在变量上方添加
UPROPERTY(Replicated))。

RepNotify也具有复制功能,当变量设置为该选项时,蓝图会生成一个Notify函数,在变量的值改变时,服务器会将改变的值同步给客户端,如果客户端中该属性原来的值与同步过来的值不一样,则会调用Notify函数,执行一些定义的操作(C++中需手动定义Notify函数,并在需要复制的变量上方声明UPROPERTY(ReplicatedUsing = 函数名))。

Replication Condition:属性复制条件,其各个选项功能如下:

COND_InitiaIOnIy该属性仅在初始数据时尝试发送
COND_OwnerOnly该属性仅发送至actor的所有者
COND_SkipOwner该属性将发送至除所有者之外的每个连接
COND_SimuIatedOnIy该属性仅发送至模拟actor
COND_AutonomousOnIy该属性仅发送给自治(主控)actor
COND_SimuIatedOrPhysics该属性仅发送给自治(主控)actor
COND_lnitialOrOwner该属性将发送初始数据包,或者发送至actor所有者
COND_Custom该属性没有特定条件,但需要通过SetCustomIsActiveOverride得到开启/关

RPC

RPC即远程过程调用,适用于函数,有如下几种使用形式:

Not Replicated:不启用复制功能。

Multicast:多播,若在服务器调用,服务器将使该函数在所有客户端执行;若在客户端调用,函数将只在本地执行。

Run On Server:服务器或客户端均可调用,函数将在服务器上执行。

Run On owning Client:服务器或客户端均可调用,若在服务器调用,将在Actor所属客户端执行(单独服务器无客户端的话就在服务器上执行),若在客户端调用,则在本地客户端执行。

总的来说,服务器调用RPC所有权如下:

客户端调用RPC所有权如下:

举个利用RPC实现同步的简单例子,如果客户端播放一个蒙太奇动画,想实现这个动画所有端都能同步播放的话,可以写一个自定义事件MulticastPlayMontage,将其设为Multicast,直接调用PlayMontage方法;再写一个自定义事件ServerPlayMontage,设为Run On Server,调用MulticastPlayMontage事件:

在本地客户端中需要同步播放蒙太奇动画的地方直接调用ServerPlayMontage,方法将由客户端调用,在服务器执行,然后服务器又会执行MulticastPlayMontage方法多播给所有客户端,实现所有端的同步播放。

有关UE4网络同步的更多相关文章

  1. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  2. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  3. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  4. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  5. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

  6. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

    我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

  7. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  8. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

  9. 常见网络安全产品汇总(私信发送思维导图) - 2

    安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un

  10. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

随机推荐