前篇文章概括性的介绍了UE4的网络通信。地址如下。
在本篇文章中,对UE4的网络相关性继续进行讨论。
网络相关性在传统的MMORPG游戏中有另外一个名称AOI(Area Of Intrest)。
一个游戏世界中的Actr数量太多,对于某个连接来说,它如果关注所有的Actor,那么同步带来的计算量就会很大。所以我们引入网络相关性来裁减需要同步的Actor数量。 前章已经提到了判断某个Actor和某个连接是否相关的属性配置,我们可以简单的归为三类。
对于UE4默认的相关性算法就是最简单的遍历。对于下图所示的例子。
可以看到,图中有两个人形Actor,他们对应了两个客户端连接。那么如果有N个actor, M个客户端连接,则会带来O(N*M)的计算复杂度。这个复杂度,可以将上面的例子转化为顶视图,用下图来演示。
Unreal 4.21版本正式发布了Replication Graph。Replication Graph简单的讲是一种空间换时间的做法。它为所有的Actor提前创建好索引。比如同步范围为所有连接的Actor放在AlwaysRelevant索引下,同步范围为OnlyRelevantToOwner,放在以连接为key的Relevant For Connection索引下。
特别的,对于同步距离,Replication Graph提供了一种基于九宫格的相关性裁减算法。
该算法实现思路算法如下
特别的,加入网格的Actor有静态和动态之分。
使用Replication Graph后,多了一些索引维护的开销,但整体可以将之前O(N*M)的复杂度降低为O(M)。
利用Replication Graph,理论上我们可以扩展更多的索引节点,并定制AOI算法。
在我经历的项目中,我们将节点扩展为Relevant For Team和Relevent Folllow Owner。
Relevant For Team比较好理解,就是队伍内共享的相关性。 Relevent Folllow Owner就是该Actor的相关性跟随其Owner;当这个Owner和某个连接相关时,则Follow该Owner的Acotr也和该连接相关。
特别的,我们又对游戏内大量存在的道具做了动态的索引调整。
由于我们引入了这种动态的相关性策略。我们同时引入了策略的缓存,因为在每一帧的tick阶段可能会有多次的相关性调整。但对于这一帧来讲,只有最后一次的才会生效。通过缓存最后一次的操作,我们可以减少单帧内相关性调整次数。 实测下来,这个缓存策略带来的性能优化效果有限,更多的是带来处理逻辑的统一。
当然,如果还想进一步优化,可以根军自己项目的实际情况,替换现有九宫格空间裁减算法。
网络相关性就先介绍到这里。 下一篇准备介绍下属性同步。