void UWorld::AddNetworkActor( AActor\* Actor )
{
if ( Actor == nullptr )
{
return;
}
if ( Actor->IsPendingKill() )
{
return;
}
if ( !ContainsLevel(Actor->GetLevel()) )
{
return;
}
ForEachNetDriver(GEngine, this, [Actor](UNetDriver\* const Driver)
{
if (Driver != nullptr)
{
// Special case the demo net driver, since actors currently only have one associated NetDriverName.
Driver->GetNetworkObjectList().FindOrAdd(Actor, Driver->NetDriverName);
}
});
}
// 总入口函数
int32 UNetDriver::ServerReplicateActors(float DeltaSeconds)
{
// 确定当前的连接客户端
ServerReplicateActors\_PrepConnections
//确定同步列表(性能瓶颈点)
ServerReplicateActors\_BuildConsiderList
//对Actor列表进行优先级排序(性能瓶颈点)
ServerReplicateActors\_PrioritizeActors
//处理排序过后的Actor列表(这里会进行最终的同步操作)
ServerReplicateActors\_ProcessPrioritizedActors
}
void UNetDriver::AddNetworkActor(AActor\* Actor)
{
GetNetworkObjectList().FindOrAdd(Actor, NetDriverName);
if (ReplicationDriver)
{
ReplicationDriver->AddNetworkActor(Actor);
}
}
- GridSpatialization2D 会按照cellsize划分为多个网格
- AddActo
- 存在
- 根据种类添加到对应的列表中,静态,动态,休眠等等
- 静态动态中有划分为是否是属于streamingLevel中等
- 不存在网格
- 创建网格(和裁剪距离,Cellsize都有关系),重复网格存在的添加步骤
- 更新
- 超过现有的网格边界
- 创建新的网格
- 刷新网格中的Actorlist
- 根据动态Actor位置刷新网格中的actorList
// 总入口函数
int32 UNetDriver::ServerReplicateActors(float DeltaSeconds)
{
// 转发到同步图表类中
ReplicationDriver->ServerReplicateActors(DeltaSeconds);
int32 UReplicationGraph::ServerReplicateActors(float DeltaSeconds)
{
//各个节点的前期同步准备工作(对于空间划分的Grid主要是刷新各个网格中的Actor列表)
for (UReplicationGraphNode\* Node : PrepareForReplicationNodes)
{
Node->PrepareForReplication();
}
// 处理各个链接的客户端
for (UNetReplicationGraphConnection\* ConnectionManager: Connections)
{
//公共节点中需要的Actor列表
for (UReplicationGraphNode\* Node : GlobalGraphNodes)
{
Node->GatherActorListsForConnection(Parameters);
}
//相关联的节点中的Actor列表
for (UReplicationGraphNode\* Node : ConnectionManager->ConnectionGraphNodes)
{
Node->GatherActorListsForConnection(Parameters);
}
//真正Actor进行同步的地方,剩下的和老版本网络流程一致
ReplicateSingleActo
}
}
}
- DefaultEngine.ini 配置自己重写的同步图表类
- [/Script/OnlineSubsystemUtils.IpNetDriver]
ReplicationDriverClassName="/Script/ProjectName.ClassName"
- 创建委托
UReplicationDriver::CreateReplicationDriverDelegate().BindLambda([](UNetDriver\* ForNetDriver, const FURL& URL, UWorld\* World) -> UReplicationDriver\*
{
return NewObject<UMyReplicationDriverClass>(GetTransientPackage());
});
| Type | 标准网络 | Graph网络 |
|---------- |:-------------:|:-------------:|
| ActorList | 全量存储 | 按类型划分存储|
| 自定义网络同步 | 不支持 | 支持|
| 优化方式 | 有损效果,降频,降低裁剪距离 | 细致的网格种类划分|
| 性能 | 性能较差,随着客户端和actor的增长,呈现几何增长的性能消耗 | 性能和网格的划分密切相关(fortnite官方数据此处性能消耗降低75%)|
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。