全球服的游戏服务器架构设计
版权声明
-
本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
-
文章内容不得删减、修改、演绎
-
相关学习资料见文末
主题
-
常见服务器端架构划分
-
不同类型游戏的架构选择与瓶颈
-
如何设计通用、可伸缩的全球服架构
常见游戏服务器端的架构划分
-
P2P架构
-
单线程架构
-
多线程架构
1. P2P架构:
什么是P2P架构?
在十年之前,去网吧的时候,玩到的网络游戏更多的是局域网类型的游戏。局域网游戏是怎么联机的呢?
是主机和主机之间互相连接,构成一个网状的拓扑结构,每一个主机跟别的主机之间它是一对一连接的,它叫点对点架构,英文叫P2P架构。
大家看到上面图中的是十年之前腾讯对战平台CS1.6。
这样的对战平台,是腾讯提供了一个让多位玩家连接到一个同一个局域网里面来进行游戏。
原来在必须在一个网吧,才能跟别人进行对战。有了这个对战平台后,虽然大家是在广域网里面,但是会被聚合到类似一个局域网对局中来进行游戏。
这就是这个对战平台做的事情。其实本质就是P2P架构。
P2P架构的特点
- 客户端权威
什么叫客户端权威?
每一个客户端它既充当游戏的主机,又充当游戏的客户机。当某一个客户端当它有操作的时候,他会把这个操作广播给所有的其他的玩家,那这个时候它是一个客户机。类似于现在的服务器所承担的工作。所以说P2P架构客户端权威的。 - 容易造成作弊或卡顿
为什么P2P架构容易造成作弊?
所有的运算都是在一个客户端上面进行的。每个玩家都能修改他自己客户端上面的可执行程序,类似于外挂,这样的话就会造成一个作弊的问题。
为什么传统的局域网游戏一般最多只能支持16人之间的对算?
因为每个客户端是跟所有其他客户端进行连接的,所以假设有16个客户端,那么每一次客户端的一次操作数据,都需要传输给另外的15个客户端,这里的网络开销是非常惊人的。 - 演化——帧同步方式
现在大家玩到的这种实时战斗的,特别是房间类的游戏,实时竞技的游戏,大部分都是从传统的P2P架构改进而来的。
现在称这种新的基于房间的互联网对战方式,叫做帧同步网络竞技方式。
那帧同步是不是一种新技术?
其实告诉大家它是很早之前CS包括经典的魔兽争霸就在用这样的技术了。
同时它又是一种新的技术,因为传统的这种像CS或者是魔兽争霸。
在这个局域网里面进行对战的时候,经常会游戏卡顿。
为什么会卡顿呢?
因为帧同步的游戏要求所有的玩家操作必须在同一时间里面进行计算。那么就要求每个客户端之间的操作必须完全同步。但是由于受到过去的硬件,CPU,网络等限制,所以这个运算的流畅性没有那么好。
所以说一台好的客户机要等性能不太好的客户机完成一帧的操作。即使在现在,由于是在互联网上面进行游戏,如果用传统的这种帧同步方式仍然会卡顿。
现在玩的房间类的游戏,像王者荣耀,像皇室战争,为什么不会出现卡顿呢?在这里就要提到了,现在,在互联网上面玩的这种基于帧同步的游戏,它实际上是基于第二代帧同步方式。
2. 单进程CS架构
什么是单进程CS架构?
这种游戏的架构,有简单有复杂。这里是一种比较简单的这种网络游戏的架构,也是一般手机游戏会采用的网络游戏架构。
大家对单进程CS架构这个名词比较陌生,说一个概念大家就知道了,平时所说的滚服游戏就是基于这种单进程CS架构。
滚服游戏是一个服务器一个服务器的开服,然后一个服务器一个服务器的合服,这种游戏是每一个服务器有一个单独的数据库,他们的数据之间是不互通的。
game进程
上图中的game进程,代表游戏的逻辑进程。所有这个游戏的逻辑处理都是放在这个服务器的game进程里面来进行处理的。
要访问数据库的时候也很简单,访问这个单一的数据库,它需要处理的数据就在game进程上面处理,处理完以后把处理结果就返回给客户端。这种是单进程架构。
单进程CS架构特点
- 服务器权威
单进程架构****它是服务器权威的,即使是那种一刀999的游戏,也需要通过服务器来控制玩家获得的奖励道具、充值、逻辑运算,包括玩家的移动、攻击、物品道具的买卖也都是在服务器中进行控制的。 - 大部分手游采用CS架构
为什么大部分的这种传统的手游会采用单进程架构?
原因是它开发成本是比较低的,而且由于单进程架构简单,因此它的稳定性是能够得到保障的。
有的游戏可能是通过购买源码得到的授权。比如说很多手游RPG游戏,都是换皮游戏,这些游戏大都采用单进程CS架构,只是在玩法上面做了一些创新。 - 通信
从通信方式的角度来说,这种单进程CS架构一般都是基于传统RPG游戏做了单服联网的迭代,所以在通信协议上,还是单进程架构。这些游戏很多是从页游过来的,协议上多采用HTTP协议,或者为了实现长连接,也会使用WebSocket协议、TCP协议,使用KCP协议的单进程CS架构游戏较少。因为KCP协议更适用于实时竞技游戏。
举例:滚服游戏
滚服游戏有如下特点:
- 在这儿大家可以看到这是一个滚服游戏,不断的去开新服,开新服一段时间以后,这个新服的玩家数量会逐渐的减少,减少以后就存在一个合服的问题。把人少的服务器合成一个大的服务器,这样的话可以在同一个服务器里面玩家又多起来。
- 它的特点是游戏世界里的时空是一个平行时空。每一个玩家他进不同的服务器,他玩的地图,玩的任务都是一模一样的。但是这些玩家他们之间数据是不互通的,所以说我们称之为叫平行****空间。
- 这种游戏服务器有一个限制,因为它是一种****单进程架构,所以单服的话,一般差一点的服务器可能两三千人,好一点的五六千人,所以说它的承载人数是有限的。因此,当每次开一个新服的时候,人可能会爆满。那么就再开下一个新服,这就是为什么单进程架构的游戏要不断开服的这个原因。
- 合服的时候,必须要处理好冲突问题,具体包括:
- 道具ID冲突:玩家拥有的道具,比如说在A服务器拥有的道具,它的ID号。如果你不考虑合服的话,它可能跟B服务器的道具的ID号是相同的。那么合服以后可能会有道具ID的冲突的问题。
- 角色昵称冲突:如果两个服务器中的玩家昵称相同,那么合服以后,必然发生冲突,造成合并失败,或者服务器异常。
3.多进程CS架构
什么是多进程CS架构
一个大型多人在线游戏会同时有很多个游戏的客户端去连接服务器。在连接服务器的时候,游戏的服务器有一种叫做网关服务器,会把不同的用户分配到不同的逻辑服务器上。
多进程CS架构的特点
- 共用login登录服务端、数据库、日志系统:
- 大型的网络游戏,登录服务器会采用分布式登录,游戏服务器,它会去分配这些玩家。
- 比如说第一个玩家分配到第一个游戏逻辑服务器,然后第二个玩家分配到第二个游戏逻辑服务器。那么这两个游戏逻辑服务器他们连接的数据库是相同的。
- 也就是说玩家的数据是互通的,由于游戏逻辑服务器分成了两组、三组,甚至是更多的组。于是游戏的这种压力负担,它就被平分掉了。
- 可能存在副本进程:
- 在RPG游戏里面,你可能会去打副本,那打副本的时候,就是在副本进程里面,副本进程其实也是一个游戏逻辑服务器。但是它处理的任务是不一样的,它只处理游戏的副本。
- 在实时竞技游戏重。一局游戏是开一个游戏的房间,在房间里面进行游戏。每一个房间就可以分布在一个副本进程里,把一部分的房间分布在一个副本进程里面。
- 多个进程可能对应了多台物理机器,也有可能是同一台物理机器上的不同进程,具体要看服务器的承载能力了。
多进程架构不仅可以适用于MMO类型的游戏,也适用于MOBA类型的游戏。
- MOBA类型的游戏,把房间视为副本,多个房间合并在一个game逻辑进程中进行处理。
注意:各个进程可能位于不同的物理机器,也有可能是位于同一台物理机器。如果这个各个进程位于同一个物理机器,那么它也叫分布式架构,也就是说物理机器的概念是跟分布没有关系的。
不同类型游戏的架构选择与瓶颈
什么是空间?
- 在全球服的游戏当中,在一个弹性灵活的游戏服务器架构里面,可以把一个服务器变成多个服务器,变成分布式的。
- 也可以把多个服务器合成一个服务器,变成单服,滚服的结构。
- 空间!=地图:首先在这里所说的空间英文叫做space。这个space它不等于地图,space不等于map。
空间概念举例
- 场景1:一局战斗内的玩家集合在一个空间
- 这个空间指的是一个游戏地图。但是在这里说的游戏地图并不是一个普通的游戏的障碍图,而是可探索的游戏地图。
- 每个玩家进行游戏所形成的地图是不一样的,可探索的区域是不一样的。因此这个空间跟别的对局的游戏是完全不同的。我们可以把这种完全独立的这样的一个数据的一个副本,称之为一个****空间。
- 场景2:一个地图格里的玩家集合在一个空间
- 以MMORPG游戏为例,MMO游戏的地图通常是非常大的,比如说在这个角落有一个玩家,在他对面的角落有一个玩家,他进行了移动,能不能把这个移动信息发送给在那个角落里的玩家呢?
- 答案是**不能!**如果地图上只有两个玩家,那么把左上角玩家的这个移动信息发给右下角的玩家,这是没有多大的开销的
- 但是要想象一下这一个地图上的玩家的数量是以千、万计的,那一个玩家移动一次,需要广播给其他的该地图块的所有玩家,那这个开销是非常大的。
- 场景3:一场聊天频道里的玩家集合在一个空间
- MMO游戏中有多个聊天频道,包括:世界频道、队伍频道、帮派频道等等,每一个频道就是一个空间。
- 场景4:一个帮派内的玩家集合在一个空间
- 一个帮派里面的所有玩家,也可以认为他们是集合在一个空间里面的:因为帮派里面的所有的玩家,可以在一个空间里面去完成一些任务,这些帮派任务跟其他帮派任务的数据是隔离的,这也是一个空间的概念。
何时需要空间?
Q1:新手村玩家通常最多,资源有限,如何避免玩家争夺?
- 可以把新手村分成多个线,每个线就是一个空间。
- 把玩家分到不同的线里面去,不是让每个玩家有自己的boss,而是让一组玩家跟另外一组玩家拥有不同的boss,把游戏分成不同的线就可以了。
Q2:每场战斗的地图都是可以探索的、是唯一的,如何保证每局地图的唯一性? - 每场战斗一个副本。在这里说的每一个副本就是一个space,所以说当你在服务器上,在你的分布式的游戏框架里面去建立了这个space的概念,那么就可以很好的去实现这样的一个策划需求。
MMO游戏如何利用空间
- 方式1:每张地图一个空间进程
- 比如剑网三,在这样的游戏里面,即使是一张地图,也不可能把一张地图里面所有玩家的信息同步给别的玩家。因此就需要把这个地图分割成不同的这个地图的小块。
- 每当有一个玩家进行了一个操作后,只把他的操作同步给他周围的九宫格里的其他玩家,那么可以在游戏地图里面遍历玩家他周围的九个space,包括他自己所在的这个space,去广播这样的信息。
- 但是,即使采用九宫格方式分割地图,也不能完全解决万人同服情况下的性能问题。例如:剑网三里游戏主城附近通常会在一个小范围(九宫格)内聚集大量玩家,此时数据同步的开销仍然是巨大的!
- 因此就需要采用方式2
- 方式2:每个地图格一个空间进程
- 可以让每一个格子对应一个不同的空间进程,也就是让每个格子对应不同的进程,把这些进程放在不同的物理服务器上来分担压力,这就是分布式,也是大世界。
- 那么,什么是全球服呢?
- 以皇室战争为例,全球服看上去实际上只有一个服务器登录入口,但实际上玩家会被定位到距离自己最近的服务器,匹配同样距离自己最近的玩家进行游戏,这就是全球服!
- 当然,MMO游戏也可以这样设计,具体可参考文末资料了解
如何设计通用、可伸缩的全球服架构
首先,要考虑的是单进程还是多进程,滚服还是副本
当你使用了这个全球服架构的时候,你就会发现不管是单进程、多进程,是滚服,还是副本游戏,其实它只不过是全球服****的一个缩影!
也就是说,对于一个分布式的全球服的游戏:
- 你只要把所有的逻辑合并到一个进程里面来,变成一个单进程的游戏;
- 你只需要把所有空间合并到一个进程,那么它就是一个滚服的游戏了!
全球服的设计目标
那么如何设计一个全球服的游戏服务器端架构呢?设计目标有两点最重要:
-
能够以分割空间的方式实现一个不分服的架构
-
架构可深度扩展,来实现MMO或者MOBA两种最主流的服务器架构。
如何实现全球服设计
全球服的架构通常包括这五类服务器进程:
- 登录进程:
- 有些游戏,客户端玩家在登录服务器时,通常有不止一个服务器可选,而是有多个。
- 登录服务器的前端可以再加上网关服务器,由网关服务器来去分配登录哪一个登录服务器。
- 逻辑进程:
- 登录完了以后,个网关服务器再去确定,你是登到game 1还是game 2的服务器。
- 空间进程:
- 进行游戏的过程当中,玩家可能处于不同的空间上。
- 服务器管理进程:
- 为了管理多个游戏逻辑服务器,有一个叫做逻辑进程管理的服务器,叫做APP Mgr。
- 数据库管理进程:
- 玩家的数据都会放在数据库服务器。
- 数据库服务器不一定使用同一个,数据库服务器本身也可能是分布式的。
这个分布式架构至少需要五个进程来支持。五个进程合并到一个进程以后,它就是滚服游戏。
以上就是《全球服的游戏服务器架构设计》分享的全部内容,进一步学习请参考下面学习资源
参考
进一步交流学习,请关注我
完整视频请点击本链接观看:全球服的游戏架构设计