使用iris时,当所有客户端都断线后再重连,DS在这期间的MarkPropertyDirty不会生效

我们在使用IRIS进行网络同步时,出现了以下问题:

  1. DS 上所有客户端都断开链接。
  2. 断开期间,服务端对象的属性发生变化,并调用过MarkPropertyDirty相关。
  3. 客户端重连,但是客户端没有收到这段断线期间更新后的属性值。

通过查看源码,发现是这里造成的https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Source/Runtime/Net/Iris/Private/Iris/ReplicationSystem/ReplicationSystem.cpp#L1076

// If we no longer have any valid connections we can skip part of the update.
const bool bUpdateConnectionSpecifics = Impl->ShouldUpdateForConnections();

bUpdateConnectionSpecifics为false,会导致之后的CallPreSendUpdate等不执行,也就不会将属性值更新到IRIS的ReplicatedObjectStateBuffer里。

客户端重连时,使用的是ReplicatedObjectStateBuffer,而不是重新从UObject当前属性值全量复制,所以会导致客户端的值有问题。

我们想知道,或者官方有没有计划更新

  1. 可以由项目自己控制bAllowMinimalUpdateIfNoConnections的变量,或者其它方式来控制ShouldUpdateForConnections的返回值,这样我们可以自己选择何时修改来规避这个问题。
  2. 有官方推荐或者后续更新,保证所有客户端在断线期间,重连后可以下发最新值?而不是忽略了断线期间的MarkPropertyDirty。

[Attachment Removed]

我们这里确实没有做这种特别的处理,也没有一个直接配置的方法,在初始化里把bAllowMinimalUpdateIfNoConnections这个变量设死了。所以暂时的一个Workaround是到NetDriver.cpp里加个CVAR,然后在UNetDriver::CreateReplicationSystem(bool bInitAsClient)这个函数里,// Create ReplicationSystem这块让Params.bAllowMinimalUpdateIfNoConnections = 那个CVAR。 我也会同时提一个Jira给总部看是否能够后续修复这个问题。

[Attachment Removed]