前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >全网首篇? Unreal Iris Replication中文资料

全网首篇? Unreal Iris Replication中文资料

作者头像
JohnYao
发布于 2023-04-01 03:16:51
发布于 2023-04-01 03:16:51
1.8K01
代码可运行
举报
运行总次数:1
代码可运行

前天看到Unreal 5.1引入了名为Iris的新的同步机制。过去三年一直在做UE4网络层的相关优化,看到这个新的实验特性,还是倍感振奋。在网上搜索了下,并没看到相关的中文资料。在Unreal开发者社区看到了如下文档:

《Experimental: Getting Started With Iris》(https://dev.epicgames.com/community/learning/tutorials/Xexv/unreal-engine-experimental-getting-started-with-iris

于是在ChatGPT的帮助下,将其翻译成了中文(发现人工智能的翻译水平还是有待提高),有可能是全网比较正式的首篇Iris Replication的中文资料。

《实验特性:Iris入门》

在UE 5.1版本中,引擎提供了一个名为“Iris”的新的实验性同步机制,旨在提高引擎当前同步机制的性能、可扩展性和可维护性。这个新机制是可选的,并且向后兼容。然而,新旧两种同步机制存在一些重大的差异,因此本文将解释如何启用Iris以及可能需要对项目代码进行哪些更改。

启用Iris

默认情况下,Iris系统是关闭的,不会被编译。要将其包含在您的项目中,请将以下内容添加到您项目的*.Target.cs文件中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Enable iris if it is not already on by default
if (!bUseIris)
{
    // If we enable Iris for a single target we also need to set the TargetBuildEnvironment to unique, as other projects in the solution might want it compiled out
    BuildEnvironment = TargetBuildEnvironment.Unique;
    bUseIris = true;
}

添加完毕后,在运行GenerateProjectFiles.bat之前,您可以验证Setup.bat是否成功运行。【译者注:对于已经完成编译的工程,原文这步操作似乎没有必要】

之后,当从源代码构建引擎时,Iris应该就会被编译了。值得注意的是,由于这个原因,使用引擎的二进制发行版目前无法启用该系统。

Iris在Unreal Build Tool的ModuleRules中添加了一个实用方法SetupIrisSupport(Target),以便更轻松地、可选地添加Iris所需的依赖项。要在模块中使用Iris,应该在该模块的*.Build.cs文件中调用该方法,该方法根据bUseIris决定添加相关依赖项。

项目的DefaultEngine.ini也必须修改以启用Iris。本文附带了一个处理启用和配置Iris的配置文件示例。

Iris提供了命令行参数“-UseIrisReplication=1”或“-UseIrisReplication=0”,允许使用者在运行时启用或禁用它。

最后值得注意的是,从UE5/Main的CL 22864286开始,默认情况下启用了Iris编译(即bUseIris=true),默认情况下在运行时仍然禁用Iris。为了在项目中启用Iris,仍然需要执行这里的其余步骤。此外,需要为项目启用实验性的Iris插件,并将"net.Iris.UseIrisReplication" CVar设置为1。

主要差异:

Iris尽可能地向后兼容当前同步机制,现有的属性复制和RPC定义已经支持。但是,Iris的工作仍在进行中,当前机制下的某些功能仍未提供,例如重放和异步加载。此外,这两个系统之间还存在一些较大的差异,可能需要对代码进行更改。

同步控制

Iris的一个关键设计是尽量减少同步系统和游戏玩法代码之间的交互。因此,新系统试图减少虚函数的使用,通过主动调用API函数来替代它们。以前依赖这些虚函数的功能,例如同步角色过滤、优先级和频率控制,现在都是使用API来控制。例如:

  • IsNetRelevantFor()现在由Iris的过滤API管理。在角色的BeginReplication()函数中,可以使用bAlwaysRelevant、bNetUseOwnerRelevancy和bOnlyRelevantToOwner来设置这些过滤器。有关更多信息,可以查看NetObjectFilter.h,以及NetObjectGridFilter.h/.cpp,了解更高级过滤器的示例。
  • Iris的源代码可以在“[EngineRoot]\Engine\Source\Runtime\Experimental\Iris\Core”下找到。
  • GetNetPriority()现在通过显式设置静态优先级或提供自定义优先级实现来管理。角色还可以使用提供的SphereNetObjectPrioritizer,默认情况下启用具有复制的WorldPosition的角色。有关更多信息,可以查看NetObjectPrioritizer.h,以及SphereNetObjectPrioritizer.h/.cpp。

还需要注意的是,Iris不支持Replication Graph。虽然Iris没有Replication Graph的“Node”概念,但新的网络对象过滤器和优先级设置器旨在替代Replication Graph提供的功能。

Iris还被设计为完全基于推送的。虽然可以在不使用Push Model的情况下使用Iris。当禁用Push Model时,Iris会回退到使用NetUpdateFrequency轮询所有复制的对象。但是,如果项目未启用Push Model,则可能会导致以下断言消息:"Trying to force enable Iris push model support when push model is disabled, falling back to optional path. Set Net.IsPushModelEnabled true."

要解决此问题,可以将“Net.IsPushModelEnabled”CVar 设置为 true,或者可以将“net.Iris.PushModelMode”CVar 设置为 0 或 2 以禁用或启用Push Model,同时仍允许它运行时可切换。在 5.1 中,net.Iris.PushModelMode 默认设置为 1,这将启用Push Model而无需在运行时切换它的选项,但自 CL 22482725 起,其默认值已更改为 2。

远程过程调用

在Iris中,远程过程调用(RPC)的工作方式大多与以前相同,但有一个关键的区别:RPC现在总是被推迟到,RPC依赖的连接更新之后发送。这意味着默认情况下,RPC总是在连接处理完所有同步状态数据之后执行。在之前的实现中,RPC和属性同步的执行顺序并不固定,并且在可靠和不可靠的RPC之间也存在差异。

子对象同步

以前,子对象同步依赖于角色实现虚函数AActor::ReplicateSubobjects。现在,Iris使用新添加的子对象注册列表来处理子对象同步。有关如何使用这些子对象列表的更多信息,请参见此处(https://forums.unrealengine.com/docs?topic=727659)。

未从UActorComponent派生的子对象需要实现虚方法RegisterReplicationFragments,以便向Iris注册其需要同步的属性和函数。可以在Gameplay Ability System的UAttributeSet(AttributeSet.h/.cpp)中看到其实现示例。

网络序列化

Iris引入的另一个重大变化是它使用NetSerializers来处理网络序列化。NetSerializers负责确定性地将单个类型的源数据转换为既有效地序列化为位流又可以通过位打包进行增量压缩的形式。它们还负责反向操作,从位流中反序列化数据并将其从其内部表示转换为原始源数据类型。

Iris已经支持了所有可以设置为同步的Unreal Engine基本类型,以及几个复杂类型。这些包括:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TArrays (of supported types)
TFastArrays
FName 
FString
FVector and its quantized types
FRotator 
FObject
FWeakObject
FSoftObject 
FSoftObjectPath
 FSoftClassPath
 FFieldPath
FScriptInterface
FUniqueNetIdRepl
FGameplayAbilityTargetDataHandle
FGameplayEffectContextHandle
...and most other core engine types.

如果检测到不支持的类型,则运行时日志中应该会出现告警,例如“跳过不支持的属性”。

没有实现自定义序列化器的数据结构将使用通用结构序列化器,该序列化器使用结构中每个单独属性对应的序列化器。如果结构已经实现了自定义NetSerialize函数,但没有为Iris实现自定义NetSerializer,则描述符生成器将输出告警。要开始实现自定义NetSerializer,NetSerializer.h是一个很好的参考。但是,建议尽可能避免创建自定义序列化器。一个Iris规划中的功能是提供更详细的属性描述宏,描述如何同步属性,包括要使用的序列化器、该序列化器的参数和同步条件。目标是在不需要编写自定义序列化器的情况下,为项目提供更大的控制权,同时允许自动支持增量压缩等功能。

最后,虽然我们鼓励用户尝试这个新系统,但值得重申的是,Iris目前是实验性的。该系统的工作正在进行中,最新的更改可在UE5/Main中使用。我们不建议使用实验性功能发布项目,并且这些功能的API可能会发生变化。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何手撸一个较为完整的RPC框架?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
1.4K0
0913-7.7.1-Replication Manager使用优化
在当前CDP的大部分的场景中,PART_COL_STATS和TAB_COL_STATS这两张Hive元数据表都会比较大。因为这两张表是分别存放分区表和非分区表的一些字段上的统计信息,而在CDP中Hive的CBO、Mapjoin和谓词下推等优化查询功能默认是开启的,而这些优化功能又需要基于这些统计信息来做优化,所以在一个已经稳定运行的生产环境中,对应的这两张表可能有非常庞大的数据量(上千万甚至于上亿)。
Fayson
2024/03/05
1990
0913-7.7.1-Replication Manager使用优化
UE网络通信(四)RPC&移动通信
距离上一次发表《UE网络通信》系列的文章已经过去了一年多。这段时间,UE5.0在2022年4月发布;UE5.1在2022年11月发布。好在新版本,引擎在同步方面尚未做大的变更;之前立的关于RPC,底层协议的写作flag,还是可以继续进行。
JohnYao
2023/04/28
2.8K0
UE网络通信(四)RPC&移动通信
字节跳动开源 Shmipc:基于共享内存的高性能 IPC
作者 | 字节跳动技术团队   简  介 CloudWeGo - Shmipc 是字节跳动服务框架团队研发的高性能进程间通讯库,它基于共享内存构建,具有零拷贝的特点,同时它引入的同步机制具有批量收割 IO 的能力,相对于其他进程间通讯方式能明显提升性能。在字节内部,Shmipc 应用于 Service Mesh 场景下,mesh proxy 进程与业务逻辑进程、与通用 sidecar 进程的通讯, 在大包场景和 IO 密集型场景能够取得显著的性能收益。 开源社区关于这方面的资料不多,Shmipc 的开源
深度学习与Python
2023/04/10
2.4K0
字节跳动开源 Shmipc:基于共享内存的高性能 IPC
Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8479282.html 在Android中进程间通信是比较难的一部分,同时又非常重要,针对进程间通信,博主会用四篇文章来介绍,本篇文章为IPC系列的开篇,主要介绍一些IPC中用到的一些概念、基础等,目的是让读者朋友们在学习IPC之前对一些必要的知识有一个大体的把握。在Android中进程间通讯的方式有很多种,在后续的三篇中会分别介绍每一种方式的实现过程已经各自的优缺点。 IPC是什么? I
codingblock
2018/03/30
6300
面霸篇:Dubbo 夺命 17 问
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
码哥字节
2021/08/23
4450
面霸篇:Dubbo 夺命 17 问
Android | dagger细枝篇
嗨,我是哈利迪~《看完不忘系列》之dagger(树干篇)一文对dagger做了初步介绍,下面我们一起来瞅瞅dagger的一些细节。
Holiday
2020/09/03
8110
Android | dagger细枝篇
Spring Cache简明教程
  在我上一篇文章如何正确使用缓存来提升系统性能中,我从偏理论的视角介绍了Cache在性能优化中的必要性,在这篇文章中我们介绍Spring全家桶中和cache相关Spring-Cache。
xindoo
2024/08/07
1650
我开源了一套 RPC 框架,学爆它!
呼吸不停,新项目不止!前段时间开始带大家做的新项目《从 0 到 1 开发 RPC 框架》已经完成,教程也已经写完了~
程序员鱼皮
2024/07/31
6620
我开源了一套 RPC 框架,学爆它!
组复制要求和限制 | 全方位认识 MySQL 8.0 Group Replication
--upgrade=minimal:当MySQL Server指定--upgrade=minimal选项启动时,如果发现需要执行更新,则,在执行升级操作完成之后,可能会导致组复制无法启动,因为minimal选项在执行更新时,只会更新数据字典、information_schema、performance_schema,但不会更新组复制内部所依赖的系统表(--upgrade选项在MySQL 8.0.16版本引入,之后,升级操作将不再需要单独使用mysql_upgrade工具,默认情况下--upgrade选项值为AUTO,表示自动判断是否需要执行完整的更新操作)。
老叶茶馆
2020/11/11
1.1K0
组复制要求和限制 | 全方位认识 MySQL 8.0 Group Replication
为了带你搞懂RPC,我们手写了一个RPC框架
远程服务调用(Remote procedure call)的概念历史已久,1981年就已经被提出,最初的目的就是为了调用远程方法像调用本地方法一样简单,经历了四十多年的更新与迭代,RPC 的大体思路已经趋于稳定,如今百家争鸣的 RPC 协议和框架,诸如 Dubbo (阿里)、Thrift(FaceBook)、gRpc(Google)、brpc (百度)等都在不同侧重点去解决最初的目的,有的想极致完美,有的追求极致性能,有的偏向极致简单。
Rude3Knife的公众号
2022/04/28
4030
为了带你搞懂RPC,我们手写了一个RPC框架
Unity3D-网络(一)高级开发-网络解决方案
Unity5.1为开发者发布全新的多玩家在线工具、技术和服务。该技术的内部项目名称为 UNET,全称为 Unity Networking。 第一阶段是多玩家在线技术基础。 第二阶段基于第一阶段,借助模拟服务器引入服务器权威游戏 (server authoritative gaming) 概念。 第三阶段是最后阶段,我们想通过主模拟服务器赋予协调多个模拟服务器的能力。
孙寅
2020/06/02
3.3K0
卷起来了!手把手带你写一个中高级程序员必会的分布式RPC框架
◆ 一.概述 什么是RPC? 远程服务调用 官方:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想 通俗一点:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 市面上常见的rpc框架:dobbo,springCloud,gRPC... 那为什么要有 RPC,HTTP 不好么? 因为 RPC 和 HTTP 就不是一个层级的东西,所以严格意义上这两个没有可比性,也不应该来作比较。 HTTP 只是传输协议,协议只是规范了一定的交流格式 R
IT大咖说
2022/03/04
2860
为了带你搞懂RPC,我们手写了一个RPC框架
远程服务调用(Remote procedure call)的概念历史已久,1981年就已经被提出,最初的目的就是为了调用远程方法像调用本地方法一样简单,经历了四十多年的更新与迭代,RPC 的大体思路已经趋于稳定,如今百家争鸣的 RPC 协议和框架,诸如 Dubbo (阿里)、Thrift(FaceBook)、gRpc(Google)、brpc (百度)等都在不同侧重点去解决最初的目的,有的想极致完美,有的追求极致性能,有的偏向极致简单。
PPPHUANG
2022/04/12
1.2K0
Cat原理简析
一次业务追踪就是逻辑链路的某一次执行情况的还原,逻辑链路完整准确地描述了业务逻辑全景,同时作为载体可以实现业务日志的高效组织。
大忽悠爱学习
2023/04/23
1.2K0
Cat原理简析
构建SatelliteRpc:基于Kestrel的RPC框架(整体设计篇)
之前在.NET 性能优化群内交流时,我们发现很多朋友对于高性能网络框架有需求,需要创建自己的消息服务器、游戏服务器或者物联网网关。但是大多数小伙伴只知道 DotNetty,虽然 DotNetty 是一个非常优秀的网络框架,广泛应用于各种网络服务器中,不过因为各种原因它已经不再有新的特性支持和更新,很多小伙伴都在寻找替代品。
InCerry
2024/02/26
1550
构建SatelliteRpc:基于Kestrel的RPC框架(整体设计篇)
PyTorch 1.5上线:加入稳定C++前端,高级自动梯度API
今天,PyTorch 1.5 宣布上线,此版本主要包括几个新的 API 的添加和改进。新版 PyTorch 包括对 C++前端的重大更新,用于计算机视觉模型的「channels last」存储格式,以及用于模型并行训练的分布式 RPC 框架的稳定版本。该版本还提供了针对自动求导机制中黑塞和雅可比的新 API,以及受 pybind 启发,允许用户创建自定义 C++类的一个 API。另外,torch_xla 已可在 PyTorch 1.5 版中使用,并在 1.5 版本中进行了测试,可提供成熟的 Cloud TPU 体验。
机器之心
2020/04/23
5770
Oracle 高级数据复制(Advanced Replication)
一、试验环境: A机:IP:10.1.8.201      OS:WindowsServer 2003 Standard Edition SP1;      DB:Oracle 10g Enterpr
用户1148526
2018/01/03
8310
gRPC 基础概念详解
作者:jasonzxpan,腾讯 IEG 运营开发工程师 gRPC (gRPC Remote Procedure Calls) 是 Google 发起的一个开源远程过程调用系统,该系统基于 HTTP/2 协议传输,本文介绍 gRPC 的基础概念,首先通过关系图直观展示这些基础概念之间关联,介绍异步 gRPC 的 Server 和 Client 的逻辑;然后介绍 RPC 的类型,阅读和抓包分析 gRPC 的通信过程协议,gRPC 上下文;最后分析 grpc.pb.h 文件的内容,包括 Stub 的能力、
腾讯技术工程官方号
2021/07/12
4.2K0
HBase实践 | HBase IO优化与高可用建设
在CAP能力模型表现方面,hbase主要是面向CP的应用系统,针对数据写入可以满足强一致性需求,从客户端视角来看写入成功之后的数据是即时可见的。然而hbase的CP模型目前还存在很大的短板,比如当有服务节点出现宕机事件时,需要经历很长时间的MTTR过程,耗时主要体现在以下两个方面:
大数据技术架构
2020/05/12
1.6K0
相关推荐
如何手撸一个较为完整的RPC框架?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验