全球服的游戏服务器架构设计

news2024/11/15 15:51:55

全球服的游戏服务器架构设计

image

版权声明

  • 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明

  • 文章内容不得删减、修改、演绎

  • 相关学习资料见文末
    image

主题

  • 常见服务器端架构划分

  • 不同类型游戏的架构选择与瓶颈

  • 如何设计通用、可伸缩的全球服架构

常见游戏服务器端的架构划分

image

  1. P2P架构

  2. 单线程架构

  3. 多线程架构

1. P2P架构:

image

什么是P2P架构?

在十年之前,去网吧的时候,玩到的网络游戏更多的是局域网类型的游戏。局域网游戏是怎么联机的呢?
是主机和主机之间互相连接,构成一个网状的拓扑结构,每一个主机跟别的主机之间它是一对一连接的,它叫点对点架构,英文叫P2P架构
大家看到上面图中的是十年之前腾讯对战平台CS1.6。
这样的对战平台,是腾讯提供了一个让多位玩家连接到一个同一个局域网里面来进行游戏。
原来在必须在一个网吧,才能跟别人进行对战。有了这个对战平台后,虽然大家是在广域网里面,但是会被聚合到类似一个局域网对局中来进行游戏。
这就是这个对战平台做的事情。其实本质就是P2P架构。

P2P架构的特点

  1. 客户端权威
    什么叫客户端权威?
    每一个客户端它既充当游戏的主机,又充当游戏的客户机。当某一个客户端当它有操作的时候,他会把这个操作广播给所有的其他的玩家,那这个时候它是一个客户机。类似于现在的服务器所承担的工作。所以说P2P架构客户端权威的。
  2. 容易造成作弊或卡顿
    为什么P2P架构容易造成作弊?
    所有的运算都是在一个客户端上面进行的。每个玩家都能修改他自己客户端上面的可执行程序,类似于外挂,这样的话就会造成一个作弊的问题。
    为什么传统的局域网游戏一般最多只能支持16人之间的对算?
    因为每个客户端是跟所有其他客户端进行连接的,所以假设有16个客户端,那么每一次客户端的一次操作数据,都需要传输给另外的15个客户端,这里的网络开销是非常惊人的。
  3. 演化——帧同步方式
    现在大家玩到的这种实时战斗的,特别是房间类的游戏,实时竞技的游戏,大部分都是从传统的P2P架构改进而来的。
    现在称这种新的基于房间的互联网对战方式,叫做帧同步网络竞技方式
    那帧同步是不是一种新技术?
    其实告诉大家它是很早之前CS包括经典的魔兽争霸就在用这样的技术了。
    同时它又是一种新的技术,因为传统的这种像CS或者是魔兽争霸。
    在这个局域网里面进行对战的时候,经常会游戏卡顿。
    为什么会卡顿呢?
    因为帧同步的游戏要求所有的玩家操作必须在同一时间里面进行计算。那么就要求每个客户端之间的操作必须完全同步。但是由于受到过去的硬件,CPU,网络等限制,所以这个运算的流畅性没有那么好。
    所以说一台好的客户机要等性能不太好的客户机完成一帧的操作。即使在现在,由于是在互联网上面进行游戏,如果用传统的这种帧同步方式仍然会卡顿。
    现在玩的房间类的游戏,像王者荣耀,像皇室战争,为什么不会出现卡顿呢?在这里就要提到了,现在,在互联网上面玩的这种基于帧同步的游戏,它实际上是基于第二代帧同步方式

2. 单进程CS架构

image

什么是单进程CS架构?

这种游戏的架构,有简单有复杂。这里是一种比较简单的这种网络游戏的架构,也是一般手机游戏会采用的网络游戏架构。
大家对单进程CS架构这个名词比较陌生,说一个概念大家就知道了,平时所说的滚服游戏就是基于这种单进程CS架构。
滚服游戏是一个服务器一个服务器的开服,然后一个服务器一个服务器的合服,这种游戏是每一个服务器有一个单独的数据库,他们的数据之间是不互通的。

game进程

上图中的game进程,代表游戏的逻辑进程。所有这个游戏的逻辑处理都是放在这个服务器的game进程里面来进行处理的。
要访问数据库的时候也很简单,访问这个单一的数据库,它需要处理的数据就在game进程上面处理,处理完以后把处理结果就返回给客户端。这种是单进程架构

单进程CS架构特点

  1. 服务器权威
    单进程架构****它是服务器权威的,即使是那种一刀999的游戏,也需要通过服务器来控制玩家获得的奖励道具、充值、逻辑运算,包括玩家的移动、攻击、物品道具的买卖也都是在服务器中进行控制的。
  2. 大部分手游采用CS架构
    为什么大部分的这种传统的手游会采用单进程架构
    原因是它开发成本是比较低的,而且由于单进程架构简单,因此它的稳定性是能够得到保障的
    有的游戏可能是通过购买源码得到的授权。比如说很多手游RPG游戏,都是换皮游戏,这些游戏大都采用单进程CS架构,只是在玩法上面做了一些创新。
  3. 通信
    从通信方式的角度来说,这种单进程CS架构一般都是基于传统RPG游戏做了单服联网的迭代,所以在通信协议上,还是单进程架构。这些游戏很多是从页游过来的,协议上多采用HTTP协议,或者为了实现长连接,也会使用WebSocket协议、TCP协议,使用KCP协议的单进程CS架构游戏较少。因为KCP协议更适用于实时竞技游戏。

举例:滚服游戏

image
滚服游戏有如下特点:

  1. 在这儿大家可以看到这是一个滚服游戏,不断的去开新服,开新服一段时间以后,这个新服的玩家数量会逐渐的减少,减少以后就存在一个合服的问题。把人少的服务器合成一个大的服务器,这样的话可以在同一个服务器里面玩家又多起来。
  2. 它的特点是游戏世界里的时空是一个平行时空。每一个玩家他进不同的服务器,他玩的地图,玩的任务都是一模一样的。但是这些玩家他们之间数据是不互通的,所以说我们称之为叫平行****空间
  3. 这种游戏服务器有一个限制,因为它是一种****单进程架构,所以单服的话,一般差一点的服务器可能两三千人,好一点的五六千人,所以说它的承载人数是有限的。因此,当每次开一个新服的时候,人可能会爆满。那么就再开下一个新服,这就是为什么单进程架构的游戏要不断开服的这个原因。
  4. 合服的时候,必须要处理好冲突问题,具体包括:
    1. 道具ID冲突:玩家拥有的道具,比如说在A服务器拥有的道具,它的ID号。如果你不考虑合服的话,它可能跟B服务器的道具的ID号是相同的。那么合服以后可能会有道具ID的冲突的问题。
    2. 角色昵称冲突:如果两个服务器中的玩家昵称相同,那么合服以后,必然发生冲突,造成合并失败,或者服务器异常。

3.多进程CS架构

image

什么是多进程CS架构

一个大型多人在线游戏会同时有很多个游戏的客户端去连接服务器。在连接服务器的时候,游戏的服务器有一种叫做网关服务器,会把不同的用户分配到不同的逻辑服务器上。

多进程CS架构的特点

  1. 共用login登录服务端、数据库、日志系统:
    1. 大型的网络游戏,登录服务器会采用分布式登录,游戏服务器,它会去分配这些玩家。
    2. 比如说第一个玩家分配到第一个游戏逻辑服务器,然后第二个玩家分配到第二个游戏逻辑服务器。那么这两个游戏逻辑服务器他们连接的数据库是相同的
    3. 也就是说玩家的数据是互通的,由于游戏逻辑服务器分成了两组、三组,甚至是更多的组。于是游戏的这种压力负担,它就被平分掉了。
  2. 可能存在副本进程:
    1. 在RPG游戏里面,你可能会去打副本,那打副本的时候,就是在副本进程里面,副本进程其实也是一个游戏逻辑服务器。但是它处理的任务是不一样的,它只处理游戏的副本。
    2. 在实时竞技游戏重。一局游戏是开一个游戏的房间,在房间里面进行游戏。每一个房间就可以分布在一个副本进程里,把一部分的房间分布在一个副本进程里面
  3. 多个进程可能对应了多台物理机器,也有可能是同一台物理机器上的不同进程,具体要看服务器的承载能力了。
    多进程架构不仅可以适用于MMO类型的游戏,也适用于MOBA类型的游戏。
  • MOBA类型的游戏,把房间视为副本,多个房间合并在一个game逻辑进程中进行处理。
    注意:各个进程可能位于不同的物理机器,也有可能是位于同一台物理机器。如果这个各个进程位于同一个物理机器,那么它也叫分布式架构,也就是说物理机器的概念是跟分布没有关系的。

不同类型游戏的架构选择与瓶颈

什么是空间?

image

  • 在全球服的游戏当中,在一个弹性灵活的游戏服务器架构里面,可以把一个服务器变成多个服务器,变成分布式的。
  • 也可以把多个服务器合成一个服务器,变成单服,滚服的结构。
  • 空间!=地图:首先在这里所说的空间英文叫做space。这个space它不等于地图,space不等于map。

空间概念举例

  • 场景1:一局战斗内的玩家集合在一个空间
    • 这个空间指的是一个游戏地图。但是在这里说的游戏地图并不是一个普通的游戏的障碍图,而是可探索的游戏地图。
    • 每个玩家进行游戏所形成的地图是不一样的,可探索的区域是不一样的。因此这个空间跟别的对局的游戏是完全不同的。我们可以把这种完全独立的这样的一个数据的一个副本,称之为一个****空间
  • 场景2:一个地图格里的玩家集合在一个空间
    • 以MMORPG游戏为例,MMO游戏的地图通常是非常大的,比如说在这个角落有一个玩家,在他对面的角落有一个玩家,他进行了移动,能不能把这个移动信息发送给在那个角落里的玩家呢?
    • 答案是**不能!**如果地图上只有两个玩家,那么把左上角玩家的这个移动信息发给右下角的玩家,这是没有多大的开销的
    • 但是要想象一下这一个地图上的玩家的数量是以千、万计的,那一个玩家移动一次,需要广播给其他的该地图块的所有玩家,那这个开销是非常大的。
  • 场景3:一场聊天频道里的玩家集合在一个空间
    • MMO游戏中有多个聊天频道,包括:世界频道、队伍频道、帮派频道等等,每一个频道就是一个空间
  • 场景4:一个帮派内的玩家集合在一个空间
    • 一个帮派里面的所有玩家,也可以认为他们是集合在一个空间里面的:因为帮派里面的所有的玩家,可以在一个空间里面去完成一些任务,这些帮派任务跟其他帮派任务的数据是隔离的,这也是一个空间的概念。

何时需要空间?

image
Q1:新手村玩家通常最多,资源有限,如何避免玩家争夺?

  • 可以把新手村分成多个线,每个线就是一个空间。
  • 把玩家分到不同的线里面去,不是让每个玩家有自己的boss,而是让一组玩家跟另外一组玩家拥有不同的boss,把游戏分成不同的线就可以了。
    Q2:每场战斗的地图都是可以探索的、是唯一的,如何保证每局地图的唯一性?
  • 每场战斗一个副本。在这里说的每一个副本就是一个space,所以说当你在服务器上,在你的分布式的游戏框架里面去建立了这个space的概念,那么就可以很好的去实现这样的一个策划需求。

MMO游戏如何利用空间

  • 方式1:每张地图一个空间进程
    image
    • 比如剑网三,在这样的游戏里面,即使是一张地图,也不可能把一张地图里面所有玩家的信息同步给别的玩家。因此就需要把这个地图分割成不同的这个地图的小块。
    • 每当有一个玩家进行了一个操作后,只把他的操作同步给他周围的九宫格里的其他玩家,那么可以在游戏地图里面遍历玩家他周围的九个space,包括他自己所在的这个space,去广播这样的信息。
    • 但是,即使采用九宫格方式分割地图,也不能完全解决万人同服情况下的性能问题。例如:剑网三里游戏主城附近通常会在一个小范围(九宫格)内聚集大量玩家,此时数据同步的开销仍然是巨大的!
    • 因此就需要采用方式2
  • 方式2:每个地图格一个空间进程
    image
    • 可以让每一个格子对应一个不同的空间进程,也就是让每个格子对应不同的进程,把这些进程放在不同的物理服务器上来分担压力,这就是分布式,也是大世界
    • 那么,什么是全球服呢?
    • 以皇室战争为例,全球服看上去实际上只有一个服务器登录入口,但实际上玩家会被定位到距离自己最近的服务器,匹配同样距离自己最近的玩家进行游戏,这就是全球服
    • 当然,MMO游戏也可以这样设计,具体可参考文末资料了解

如何设计通用、可伸缩的全球服架构

image
首先,要考虑的是单进程还是多进程滚服还是副本
当你使用了这个全球服架构的时候,你就会发现不管是单进程、多进程,是滚服,还是副本游戏,其实它只不过是全球服****的一个缩影!
也就是说,对于一个分布式的全球服的游戏:

  • 你只要把所有的逻辑合并到一个进程里面来,变成一个单进程的游戏;
  • 你只需要把所有空间合并到一个进程,那么它就是一个滚服的游戏了!

全球服的设计目标

image
那么如何设计一个全球服的游戏服务器端架构呢?设计目标有两点最重要:

  1. 能够以分割空间的方式实现一个不分服的架构

  2. 架构可深度扩展,来实现MMO或者MOBA两种最主流的服务器架构。

如何实现全球服设计

image
全球服的架构通常包括这五类服务器进程:

  • 登录进程:
    • 有些游戏,客户端玩家在登录服务器时,通常有不止一个服务器可选,而是有多个。
    • 登录服务器的前端可以再加上网关服务器,由网关服务器来去分配登录哪一个登录服务器。
  • 逻辑进程:
    • 登录完了以后,个网关服务器再去确定,你是登到game 1还是game 2的服务器。
  • 空间进程:
    • 进行游戏的过程当中,玩家可能处于不同的空间上。
  • 服务器管理进程:
    • 为了管理多个游戏逻辑服务器,有一个叫做逻辑进程管理的服务器,叫做APP Mgr。
  • 数据库管理进程:
    • 玩家的数据都会放在数据库服务器。
    • 数据库服务器不一定使用同一个,数据库服务器本身也可能是分布式的。

这个分布式架构至少需要五个进程来支持。五个进程合并到一个进程以后,它就是滚服游戏

以上就是《全球服的游戏服务器架构设计》分享的全部内容,进一步学习请参考下面学习资源

参考

进一步交流学习,请关注我
完整视频请点击本链接观看:全球服的游戏架构设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1248015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 爬百度热搜并生成词云

1、爬取百度body存入txt def get_baidu_hot():url "https://top.baidu.com/board?tabrealtime"headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3&…

定制手机套餐---python序列

if __name__ __main__:print("定制手机套餐")print("")#定义电话时长:字典callTimeOptions{1:0分钟,2:50分钟,3:100分钟,4:300分钟,5:不限量}keyinput("请输入电话时长的选择编号:")valuecallTimeOptions.get(key)if val…

看完就会,从抓包到接口测试的全过程解析【1500字保姆级教程】

一、为什么抓包 1、从功能测试角度 通过抓包查看隐藏字段 Web 表单中会有很多隐藏的字段,这些隐藏字段一般都有一些特殊的用途,比如收集用户的数据,预防 CRSF 攻击,防网络爬虫,以及一些其他用途。这些隐藏字段在界面…

中国上市公司漂绿程度及其同构指数(多种测算方法,2012-2022年)

数据简介:20 世纪 90 年代开始,国际上关于绿色市场和绿色管理的学术文献日渐丰富,众多企业积极响应碳排放政策的号召,但其中有多少企业是实实在在的进行碳减排技术创新,又有多少企业打着绿色低碳行为的口号来吸引眼球、…

举个栗子!Quick BI 技巧(4):创建面积图

面积图又叫区域图,是在折线图的基础之上形成的, 它将折线图中折线与自变量坐标轴之间的区域使用颜色或者纹理填充,这样一个填充区域我们叫做面积,颜色的填充也可以更好的突出趋势信息。 有数据粉好奇如何使用 Quick BI 来制作面积图&#xf…

CAD图纸管理软件是否支持自定义属性?

CAD图纸管理软件是否支持自定义属性? 彩虹图纸管理软件_图纸管理系统_图纸文档管理软件系统_彩虹EDM【官网】 CAD图纸管理软件 是一种专业用于管理CAD图纸的工具,它可以帮助用户更加方便地管理、分类和检索自己的CAD图纸。在这个软件中,自定…

沃趣班11月月考题目解析

沃趣班11月月考题目解析 1.在oracle中创建用户时,若未设置default tablespace关键字,则oracle将哪个表空间分配给用户作为默认表空间 答案:D.user SQL> create user mytest identified by 123456; SQL> grant connect to mytest; SQL…

【开源】基于Vue和SpringBoot的独居老人物资配送系统

项目编号: S 045 ,文末获取源码。 \color{red}{项目编号:S045,文末获取源码。} 项目编号:S045,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4…

色彩 (3)AWB问题

#灵感# AWB 的问题,说难其实也不是很难。 前提: 对于特定的光信号输入,设备的输出信号取决于RGB三通道的频率响应,不同的sensor频率响应一般是不同的。QE曲线描述的就是图像传感器的光电转换效率. 1、灰区设置 标定用标准光源灯…

应用场景丨隧道健康监测系统建设,提高隧道的应急措施

在繁忙的城市交通中,隧道作为重要的枢纽,每天承载着大量的车流和人流。然而,隧道内部的环境和结构状况往往难以掌握,给交通安全带来了潜在的隐患。为了解决这一问题,建立隧道健康监测系统势在必行。 根据《交通运输部关…

【Unity入门】碰撞检测

碰撞器由来 1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent),一些背景对象则可以取消该组件。 2.在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非…

pcr扩增原理中的变性 退火 延申扩增

一、PCR简介 聚合酶链式反应(PCR)是一种用于放大扩增特定的DNA片段的分子生物学技术,它可看作是生物体外的特殊DNA复制,PCR的最大特点是能将微量的DNA大幅增加。 二、PCR原理 1.背景 DNA的半保留复制是生物进化和传代的重要途…

PHP众筹系统源码+支持报名众筹+商品众筹+无偿众筹+市面上所有的众筹模式 附带完整的搭建教程

大家好啊,罗峰今天来给大家分好用的源码系统了。今天要给大家分享的是一款PHP众筹系统源码。众筹作为一种新型的融资方式,逐渐在市场上占据了重要的地位。从公益众筹到商品众筹,再到股权众筹,各种众筹模式层出不穷。然而&#xff…

水淹七军(递归,又是递归)

北大2023级最强新生问我的,最后他的问题说是重写了一遍就解决了 乐死了,有的时候根本看不出源代码漏了哪里 我的思路是: 一个数组记录本次放水所经过的格子,经过的不再递归 一个数组记录地图上各地点的高度 一个数组记录地图…

string OJ题

目录 1.仅仅反转字母 2.字符串中的第一个唯一字符​编辑 3.字符串最后一个单词的长度 4.替换空格 1.仅仅反转字母 我们可以定义两个变量来表示数组首尾位置的有效字符的下标,然后分别从前和从后向中间遍历,只要遇到字母就停下来,利用库函数…

黑马点评笔记 redis实现优惠卷秒杀

文章目录 难题全局唯一IDRedis实现全局唯一Id 超卖问题问题解决方案乐观锁问题 一人一单 难题 要解决优惠卷秒杀的问题我们要考虑到三个个问题,全局唯一ID,超卖问题,一人一单。 全局唯一ID 用户抢购时,就会生成订单并保存到同一…

从裸机启动开始运行一个C++程序(十四)

前序文章请看: 从裸机启动开始运行一个C程序(十三) 从裸机启动开始运行一个C程序(十二) 从裸机启动开始运行一个C程序(十一) 从裸机启动开始运行一个C程序(十) 从裸机启动…

喜报!美格智能连续五年荣获物联网100强企业

近日,由中国科学院主管、科学出版社主办的《互联网周刊》联合eNet研究院发布了“2023物联网企业100强”榜单,美格智能凭借在技术创新、市场表现、综合实力等多方面的健稳表现连续五年入选榜单。 《互联网周刊》创办于1998年,是最为权威的商业…

15 reids哨兵机制

redis主机默认是10s发送一次心跳给从节点。 从节点默认1s去发送心跳给主节点。 1、原理 当主节点出现故障时,由Redis Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。 从节点的主要两个作用: 主节点的数据备份。…

Linux——使用kill结束进程并恢复进程

目录 查看进程结束进程修复进程 查看进程 在linux中,关闭某进程之前先查看已经在运行的进程有哪些,使用下面命令查看: ps aux | grep -i apt 命令查看哪个进程正在使用 apt结束进程 结束某线程的命令为: sudo kill -9 PID 命令…