Mapz's Blog

可以递归的函数指针

UE4:ReplicationGraph4.27变化内容

Replication Graph 4.27 变化内容

UReplicationGraph::PostServerReplicateStats

在本帧执行同步后会执行此函数

1
virtual void PostServerReplicateStats(const FFrameReplicationStats& Stats) {};

其中参数

FFrameReplicationStats 定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/** Collects basic stats on the replicated actors */
struct FFrameReplicationStats
{
// Total number of actors replicated.
int32 NumReplicatedActors = 0;

// Number of actors who did not send any data when ReplicateActor was called on them.
int32 NumReplicatedCleanActors = 0;

// Number of actors replicated using the fast path.
int32 NumReplicatedFastPathActors = 0;

// Total connections replicated to during the tick including children (splitscreen) and replay connections.
int32 NumConnections = 0;

void Reset()
{
*this = FFrameReplicationStats();
}
};

主要记录了当次同步的一些信息,可利用这些信息重写函数后来做一些操作

FActorRepListRefView 重构

不再是一个包含 FActorRepList 的类型,而是由一个 TArray

1
TArray<FActorRepListType> RepList;

来直接储存 Actor 指针信息,其中 FActorRepListType 为 AActor*

增加了迭代器函数,可以直接使用 for 循环来遍同步列表了

FActorRepListRawView 不再使用,换成了 FActorRepListConstView 来存一个临时的列表引用

FActorRepListStatCollector

当前用于收集展示 RepList 的状态信息

执行控制台命令

1
Net.RepGraph.Lists.Stats

后,逻辑和 4.26 不同,因为结点的同步列表数结构发生变化了,Debug 信息的收集也不太一样了

会执行

1
void UReplicationGraph::CollectRepListStats(FActorRepListStatCollector& StatCollector) const

其中会对所有的 Node 执行

1
void UReplicationGraphNode::DoCollectActorRepListStats(FActorRepListStatCollector& StatsCollector) const

现在 Node 节点提供了一个可重写的函数

1
2
3
4
/**
* Implement this to visit any FActorRepListRefView and FStreamingLevelActorListCollection your node implemented.
*/
virtual void OnCollectActorRepListStats(struct FActorRepListStatCollector& StatsCollector) const {}

可以自定义操作

FActorRepListStatCollector

自己的结点如果需要获得准确的 Debug 信息,应当重写函数,并调用

1
void FActorRepListStatCollector::VisitRepList(const UReplicationGraphNode* NodeToVisit, const FActorRepListRefView& RepList)

1
void FActorRepListStatCollector::VisitStreamingLevelCollection(const UReplicationGraphNode* NodeToVisit, const FStreamingLevelActorListCollection& StreamingLevelList)

等来加入节点中的同步列表信息,信息记录的内容有

1
2
3
4
5
6
7
8
struct FRepListStats
{
uint32 NumLists = 0;
uint32 NumActors = 0;
uint32 MaxListSize = 0;
uint32 NumSlack = 0;
uint64 NumBytes = 0;
};

会按照节点类型,Streaming Level 类型 来分类存储展示

新增结点 TearDown 函数

1
2
/** Mark the node and all its children PendingKill */
virtual void TearDown();

因为上面的重构,需要手动调用自行管理的同步列表的 TearDown ,来清空 List

同时也可以自定义需要的逻辑在里面

例如

1
2
3
4
5
6
7
void UReplicationGraphNode_ActorList::TearDown()
{
Super::TearDown();

ReplicationActorList.TearDown();
StreamingLevelCollection.TearDown();
}