内容来自官方社区课程,翻译成中文
- Iris 是目前正在试验的新复制系统的名称,旨在提高引擎当前复制系统的性能、可扩展性和可维护性。Iris 希望实现这些改进的一些主要方法包括
o 通过移除限制可扩展性的反模式(如持续轮询游戏代码和在序列化过程中使用缓存效率低下的虚拟函数调用)来释放可扩展性
o 更好地分离复制和游戏线程数据
o 通过为多个对象和连接分担尽可能多的工作来提高效率
o 提供更简洁、更易维护的 API,以控制复制对象及其数据的处理方式
o 转向完全基于推送的复制模式
- 如需了解更详细的概况,请查看 Iris 上的文档: https://docs.unrealengine.com/5.3/en-US/iris-replication-system-in-unreal-engine/
- 在 Iris 被视为测试版之前,我们计划使 Iris 的功能与当前复制系统保持一致,并确保 Iris 的应用程序接口功能强大,不再受更改的影响。
- Iris 插件在 5.4 中仍将标记为试验版。不过,随着内部项目不断使用 Iris 运行,该系统已取得重大进展,我们认为它已接近 "测试版"。
- 除此以外,我们还有更多改进和优化 Iris 的计划,其中一些将在本常见问题中提及。请注意,这里提到的任何计划都可能发生变化。
- Iris 完全是选择性的,与当前的复制系统并存。目前,我们还没有任何计划废弃或移除当前的复制系统,即使 Iris 已经可以投入生产。
- 请注意,在开发过程中,共享的任何指标都可能发生变化,而且我们还计划对系统进行进一步优化。
- 在内部,我们已经看到使用 Iris 时服务器框架时间和内存使用量的减少,特别是在扩展到更高玩家数量时。
- 至于客户端性能,我们预计系统之间不会有明显差异。
- 值得注意的是,如果使用现有的复制系统而不是 Iris,项目有可能获得更好的复制性能,尤其是在玩家人数较少的情况下。建议对两种系统都进行测试和剖析,因为哪种系统效果最好取决于每个项目的具体情况。
- Iris 主要是为了向后兼容引擎中当前的复制工作方式,因此 C++ 和蓝图中现有的复制属性和 RPC 定义仍可正常工作。一些新功能(如通过比特包对已知接收状态进行数据 delta 压缩)将在后台自动提供。不过,也有一些明显的不同,可能需要修改项目代码。
- 本文档页面将介绍如何在项目中启用 Iris:https://docs.unrealengine.com/5.3/en-US/introduction-to-iris-in-unreal-engine/#useirisinyourproject
- 有关 Iris 入门的更多信息,包括如何配置 Iris,请访问:https://udn.unrealengine.com/s/article/Experimental-Getting-Started-With-Iris。
- 是的,Iris 支持推送模型复制。虽然有可能回到基于轮询的方法,但 Iris 的计划是将推送模型作为默认方法,从而允许比当前实现更进一步的优化。
- 是的,Iris 可以利用现有的休眠系统跳过对休眠角色的轮询。
- Iris 的一个希望是,在转向完全基于推送的复制系统后,休眠将不再需要,因为只有脏对象才会被考虑复制。
- 现有的可配置带宽限制(ConfiguredInternetSpeed、ConfiguredLanSpeed、MaxClientRate 和 MaxInternetClientRate)仍然适用于 Iris。
- DataStreams 是 Iris 提供的一项功能,它是一个接口,便于实现自定义数据的复制(请参阅 DataStream.h 中的 UDataStream)。DataStreams 的一项计划功能是按数据流配置带宽限制。
- 不支持,这是两个独立的系统,NetDriver 只能使用其中之一。
- 虽然 Iris 没有 "节点 "的概念来控制行为体复制的时间和地点,但它有自己的方案来优先处理和过滤不同连接的对象。这包括实现自定义优先级和过滤器的能力。此外,还可以控制轮询频率,这决定了一个对象被考虑复制到一个连接的频率。
- 虽然目前 Iris 中还没有集成的重播支持,但这是一项计划中的功能,在 Iris 成为测试版之前,客户端重播功能必须正常工作。
- 从 5.4 版开始,为传统复制配置的 DemoNetDriver 可以与为 Iris 配置的游戏 NetDriver 配合使用,从而实现服务器和客户端录制。
- 不支持,任何类型的多服务器系统(在服务器之间无缝移动、跨服务器复制演员等)都需要自定义实现。
- 是的,Iris 支持虚幻的 "监听服务器 "概念,其中一个实例可以作为多人游戏会话的主机,同时拥有自己的本地玩家。
- 我们希望 Iris 最终能支持甚至改进网络预测插件,例如利用 Iris 的协议方法以更灵活的方式组成模拟状态,以及利用 Iris 的 delta 压缩插件。但是,我们无法提供任何关于何时支持 Iris 的时间框架。
- 是的,Iris 兼容现有的快速阵列定义。此外,FIrisFastArraySerializer(参见 IrisFastArraySerializer.h/.cpp)中还有一个专门的快速数组序列化器;不过,这主要用于测试,可能会发生变化。
- Iris 的一个长期目标是实现 UHT 支持的本地网络数组类型,从而消除用户实现自己的 FastArrays 变体的需要。
- Iris 会将游戏的网络数据收集并序列化为数据包,与当前系统类似,数据包处理组件会对这些数据包进行加密和压缩。
- 默认情况下支持Delta replication ,Iris 中的结构体被视为原子结构体。唯一的例外是结构体中无法解析的复制对象引用,当它们可以解析时将被分派。
- Iris 中的 NetSerializer 负责将源数据转换为可高效序列化为比特流的形式,并可使用比特打包进行 delta 压缩。它还负责反向操作:从比特流中反序列化数据,并将数据转换为原始源数据类型。
- 与当前系统中的自定义 NetSerialize 函数不同,Iris 中的 NetSerializers 不负责将这些数据分派给角色/对象,因此它们的反序列化(Deserialize)和去量化(Dequantize)函数不应接触对象本身的数据。这将在稍后的 FReplicationReader::DispatchStateData 中处理。
- 要开始创建自定义序列化器,NetSerializer.h 是一个很好的参考。一些实现示例包括
o FBitfieldNetSerializer,一个相当简单的示例
o FGameplayAbilityTargetDataHandleNetSerializer,一个支持多态类型的序列化器示例
o FUniqueNetIdReplNetSerializer 是将操作转发给其他 NetSerializer 的序列化器示例。
- 建议尽可能避免创建自定义序列化器。Iris 的一个计划功能是提供更详细的属性来描述如何复制属性,包括使用哪个序列化器、序列化器的参数和复制条件。这样做的目的是让项目能够更好地控制复制的数据,而无需编写自定义序列化器,同时还能自动支持 delta 压缩等功能。