UE:网络架构

网络同步,就是使各个客户端上的角色表现保持一致,属于游戏引擎的高级功能,所以一般我们都将其归于Gameplay模块当中。不过具体的实现方案其实会深刻影响到底层的网络架构(甚至是整个游戏架构),我们既要决定通过哪种网络协议来完成,又要决定游戏各个模块的循环执行顺序,其实已经不单单是“Gameplay”层面的东西了。

虚幻引擎属于标准的CS架构(经过无数次改版的),内置状态同步功能,其同步频率与游戏的帧率相同,属于变长步更新。由于帧率完全受CPU、GPU性能的影响,所以网络同步的频率与整个项目的性能息息相关。不过,有一点我们要认识到,unreal已经是尽可能的按照自己最快的速度进行数据的发送与接收了,只要我们做好各方面的性能优化即可。

一、RPC与属性同步

在Unreal里面,同步有两种手段,即RPC与属性同步(很多服务器引擎都是如此)。与其说RPC是同步手段,不如说他是一种传输数据的方式,好处就是可以直接通过类的函数形式书写,方便理解。同时不需要你直接写Socket,也不需要你处理封包和拆包。在计算机网络的概念里面,RPC叫做“远程过程调用”,本质上就是一种传递数据的手段,而其实现方式既可以是应用层的Http,也可以是传输层的TCP/UDP。在虚幻里面,由于很多游戏的同步(比如FPS)对网络延迟要求比较苛刻,所以我们放弃了需要三次握手的TCP而改用UDP(更不可能考虑HTTP了)。RPC既可以标记为可靠,也可以标记为不可靠。可靠的RPC最终一定会到达目标终端,但不可靠的RPC除了在网络拥挤的环境下丢失,也可能在引擎限流的情况下被提前拦住。RPC本身并不是一个可以持续存在的对象,我们只能通过RPC参数“一次性”的将数据从一端发送到另一端,所以每个RPC调用只能“只执行一次”(可以理解为生命周期只有瞬间的)。如果RPC消息从网络中丢失,那么他就会永久的丢失(不可靠的RPC),所以并不适合游戏世界各种对象的状态恢复,必须要结合可以保持对象状态的属性才行。此外,UE4里面RPC并不支持回调,所有RPC函数的返回类型都是void。

属性同步,本质上属于一个比较上层的功能特性,是以每个对象为单位处理的(不支持更细粒度的同步,但理论上可以通过条件属性做部分调整,详见AACtor::PreReplicate)。unreal的服务器会按照一定频率的去执行同步对象属性的数据发送和接收,同时处理回调函数。属性同步的产生是为了维持对象的状态,是一个从概念上非常贴近“同步”二字的功能,一旦服务器上的同步属性发生了变化,就一定会发送给客户端(注意:属性同步只是服务器向客户端的同步,不存在客户端向服务器流通),也许中间会丢包会延迟(actor首次同步时是reliable的),但是其内置的机制会保证属性的值最终送达到客户端。借用一句经典的话来说就是,同步数据也许会迟到,但是永远不会缺席

无论是RPC,还是属性同步,你会发现他都是基于UObject的,或者更确切的讲都是基于Actor的(以及其附属组件)。因为这两种功能一个是利用类中的函数,另一个是利用类对象的属性,他们都需要与某一个具体的对象作为媒介,而在UE的架构中,设计都是面向对象的,每个Actor都可以理解为现实世界的对象。既然是基于Actor的,那么整个同步就与GamePlay框架紧密相连。由于我们在发送同步数据的时候需要知道这个数据应该发向哪个客户端,而客户端与服务器的链接信息(IP等)又在P

你可能感兴趣的:(网络,ue4,游戏)