ReplicationGraph里当连接断开时,某些子Node不TearDown的问题

您好,我在调试DS的UObject List的时候发现一个问题。当我们采用ReplicationGraph框架并使用Grid2D的CellNode方案时

那就是随着时间和玩家游玩数的增多,UReplicationGraphNode_ConnectionDormancyNode的实例数目在逐步增多。

[Image Removed]

我刚开始认为,​Global上来说,一个GridCellNode对应一个子Node——UReplicationGraphNode_DormancyNode,一个DormancyNode又维护了一个List,对应Connection数目的子Node列表——UReplicationGraphNode_ConnectionDormancyNode。放在ChildNode里,维持Reference关系

[Image Removed]

同时可以存放在这里,便于通过Connection快速查询[Image Removed]

鉴于我研究了它的整个生成和管理,​所以这里我感觉是有点奇怪的,当一个Connection断开(也就是UReplicationGraph::RemoveClientConnection),生命周期结束之后,它只会影响ConnectionNodes,而不会影响GlobalGraphNode

[Image Removed]

但严格意义上来说,CellNode是GlobalNodes,它管辖的DormancyNode是GlobalNodes,但实际上再下一层的ConnectionDormancyNodes严格意义上并不是Global的。

但是我们在连接断开时,并没有处理GlobalNode当中的任何逻辑,因此会导致​ConnectionDormancyNodes不触发TearDown。

请问Lyra的RepGraph框架案例里是否的确存在这样的问题?​

修改的话,是不是应该重载​UReplicationGraph::RemoveClientConnection。遍历GridNodes,找到孙Node当中Key为这个Connection的,手动将他们都TearDown掉,才会避免这样的问题?

你好,我不知道你们项目CVar_RepGraph_DormancyNode_ObsoleteBehavior设置的是什么,你可以跟下UReplicationGraphNode_DormancyNode::CallFunctionOnValidConnectionNodes,调用时会判断里面的ConnectionNodes是不是有过时的,有的话在RemoveChildNode里会TearDown并移除掉的

感谢,已处理。

我之前自己写了个Connection移除时(RepGraph同步管理器层面,遍历节点,统一管理)

这里是在节点逻辑执行时(节点自行管理),同时分批分状态处理。

目前看这里的确是实现得不错

但我不太明白为啥默认为关,Connection CleanUp之后这些节点按理说没啥存在得必要了对么。所以我认为默认还是打开比较合适,这样开发者也不用关心这里。不知您得意见如何?

我的理解主要是为了性能,可以看下UReplicationGraphNode_ConnectionDormancyNode::IsNodeObsolete里面判断是否是Obsolete的情况,一种是你说的断开链接导致的,一种是client距离比较远长时间没有收集到也会判断为Obsolete,所以默认为AlwaysValid主要是考虑到第二种情况避免经常删除添加节点造成帧率波动,如果你们这种情况可以考虑设为1

感谢,明白了。那我觉得断开连接这里,不妨可以考虑常驻删除,其他状况可以按情况而定。

调整这里后,我会去实际跑跑性能水准。

目前可能也只关心断开连接的状况

好的~