有些人生来就是为了奔跑,而有些人,则拥有更高的目标>
笔者近期在进行UE C++网络的一些开发,发现RPC这个部分它看起来很简单,理解起来也算不上难。但真正应用起来,对netcode经验不多的人也许就会遇到各种各样的问题。尤其是RPC,今天笔者来解释一下三种RPC的区别,第一篇博客,如有错误请指正,谢谢。
三种RPC的不同之处
Client
首先我们需要知道如何使用Client RPC,在ue4里是这样实现的,请看代码。
UFUNCTION(Client) void DoSomething();
值得注意的是,UFUNCTION宏中联网相关的标记可不止Server,Client,Multicast这几个,实际上还有Reliable,WithValidation等。
Reliable指的是,此函数是可靠的,百分之百会执行。我们知道,网络游戏的可变因素非常多,你不能确定每个数据包都完好无损的传输成功。
哪里需要用到Reliable呢?和游戏逻辑紧密关联的,如:重生,装备武器。
哪里不需要呢?生成特效等执不执行都无关紧要的内容不需要。Reliable标记必须用在合适的地方,否则对带宽是一个很大的挑战。
Validation则是一个bool,我们可以用它来防止数值欺骗,如果当前的伤害大于最高值,玩家就会断开连接。
Client RPC的大致原理:
如果当前执行Client RPC的是服务器(HasAuthority),那么是在服务器自身执行。如果当前不是Authority,实际上是在Client上执行,发送给Server一个请求,如果Server接受了,在Server上的副本才真正执行。在虚幻引擎中这个过程实际上是很复杂的,涉及到Client Prediction等等很多技术。而Client RPC,实际上不需要等待服务器的请求,换句话说就是障眼法,你看着本地是执行了,实际上并没有同步到服务器上,只有等服务器同意了,才会同步上去。这样可以大量提升网络流畅性和减少额外带宽消耗。
Server
UFUNCTION(Server)
Server RPC的大致原理:
服务器RPC在执行中的过程大概是这样的:如果当前的端是Server(Authority),那么就是直接在自身执行。如果没有Authority,就是Client发送请求到Server上,然后在Server上执行这些函数。
Multicast
UFUNCTION(NetMulticast)
多播实际上没什么好说的了,就是同步到所有连接的端,常用于更新比分等。
游戏引擎中的网络模块实际上是非常复杂的,这篇文章也只是讲了一个RPC的概念,实际上还有Replication RepNotify OwnerShip等等很多内容。虚幻引擎的网络是非常强大的,省去了太多我们需要操心的内容,给背后默默工作的开发人员点赞!此文章是笔者的第一篇博客,有问题还请指出,未来笔者也会更新更多的游戏引擎相关内容。