|
基本概念
1 它是一个UE的插件
2 它是一个永久存在的系统,可以在不同的逻辑帧和客户端之间共享数据
3 它由多个Replication Graph节点组合而成,这些节点按照不同的需求和规则来复制Actor到不同的客户端
4 每个节点都可以有自己独特的逻辑规则,规定节点内的Actor的复制时机和方式
优点和作用
1 由于按类型和规则来统筹管理要复制的Actor,它可以节省大量服务器的CPU运算消耗
2 可以处理大量玩家同时在线的游戏,或者同时有大量Actor需要网络复制的场景
使用技巧
1按位置划分Actor
游戏世界被划分为多个网格(例如大逃杀、MOBA或MMORPG类型的游戏)或者划分为多个房间或区域(第一人称或第三人称射击游戏),目的是尽可能的将需要同时互相更新数据的Actor放置在同一个位置区域,其中一种方法是以主玩家摄像机所处的位置,以及一定的半径来确定这个区域
2 将处于“休眠”的Actor划分出来
将位置或者状态更新频率很低的Actor划分出来,统一由一个Replication Graph节点来管理,可以节省不必要的复制体同步消耗,例如一些场景中的物体,树,箱子之类,通常它们不会改变位置和状态,只在被摧毁或者推走的时候才需要更新位置和状突
3 将玩家携带的物品和玩家一起更新
将玩家携带的物品,例如枪械,装备等可以印象玩家外观和状态的节点,划分出来由一个Replication Graph节点来管理,同时只在玩家需要同步时,同步这个节点中的Actors
4 将始终存在于所有客户端的Actor单独统一管理
将此类Actor统一由一个Replication Graph节点来管理,可以节省不必要的CPU和网络开销,例如全局比分
5 将和玩家(和小队)始终或从不相关的Actor单独统一管理
例如MOBA中的战争迷雾下眼提供得视野区域,对友方玩家或地方玩家,统一的可见或不可见,这类Actor也可以统一单独管理,可以保证所有队友统一更新,而又不用所有队友分别同步更新,以节省CPU和网络开销
插件开启方法
通过设置Replication Driver类来开启Replication Graph插件
The ShooterGame 项目是一个启用和使用Replication Graph系统的好例子
注意:Replication Graph系统无法在 console类游戏中使用,因为它不支持分屏游戏 1 配置DefaultEngine.ini
在DefaultEngine.ini文件中找到或添加[/Script/OnlineSubsystemUtils.IpNetDriver]片段
[/Script/OnlineSubsystemUtils.IpNetDriver]
ReplicationDriverClassName="/Script/ProjectName.ClassName"
2 在代码中绑定
如果游戏中拥有多个不同网络需求的地图或者游戏模式,可以为不同的地图或者游戏模式绑定不同的Replication Driver,绑定的方法为绑定一个函数到UReplicationDriver::CreateReplicationDriverDelegate方法中,绑定的函数要返回已经定义的UReplicationDriver类的实例,如下面lambda函数所示
UReplicationDriver::CreateReplicationDriverDelegate().BindLambda([](UNetDriver* ForNetDriver, const FURL& URL, UWorld* World) -> UReplicationDriver*
{
return NewObject<UMyReplicationDriverClass>(GetTransientPackage());
});
参考资料 |
|