因为有需求,我们需要解决需求。 需求一:在家里的电脑打完这一关,去朋友家的电脑上玩,又要重新打一遍。有一个地方存储数据和关卡状态该多好。 需求二:一直都是一个人玩,好希望和朋友一起玩啊。有中转的电脑,转发玩家的操作、状态就可以了。 需求三:卧槽,这个人开挂,怎么一刀把我秒了,不公平,垃圾游戏,我不玩了。有校验玩家操作、反外挂、有裁判,维持公平和游戏性。

从上面的三个需求,可以抽象出游戏服务器的功能应该有如下几点。

网络服务就是建立客户端与服务端之间的连接。
  • 玩家数据存取 最常见的就是登录,登录的时候需要取玩家数据。存,一般有三种存储方式,用户下线时写一次 DB。第二种是定时写回 DB。第三种是重要数据立即回写,例如玩家打到一个比较稀有的装备,就应该立刻保存,避免突然宕机导致数据丢失。
  • 游戏逻辑计算 逻辑计算,把以前单机时,前端的计算放到后端,这是为了防止作弊。
  • 玩家行为或状态变化的同步检测 这块可以理解成玩家可以看到他视野范围内看到什么东西。
  • 游戏服务器相比传统的互联网应用有如下特点。

  • 实时的高强度交互 一般单次请求就会产生复杂逻辑,还有一些广播和同步,比如移动同步,这就是一个很大的压力,假设你在一个二十人左右的场景里面,你发出了 5 个移动包,表示它移动的方向产生改变,目标点发生的改变,那么这个消息量将放大二十倍。
  • 业务逻辑复杂,内部耦合度高 因为延迟和敏感和高强度,那么在服务器维护状态就是一个必然的过程,这样就会导致它的逻辑比较复杂。比如你击杀一个怪物,可能它不仅仅是击杀一个怪物,还会触发一些任务的逻辑。
  • 变更频率高 游戏服务器的幅度一般没有传统的互联网应用幅度大。端游时代还好,但是现在是手游时代,基本上是一周一个小更新,一月一个大更新,所以服务器的灰度和部署需求也在逐渐变高。
  • 游戏模型发展史

    第一代游戏服务器

    初代目的游戏服务器就是一个进程单线程物阻塞,接收到玩家的消息后,按照一个消息队列来进行序列化。这种游戏的代表就是 78 年的 MUD 游戏 Multiple User Domain,文字网游的统称,没有图形,通常是在终端与玩家交互,全部用文字和字符画来构成。

    第二代游戏服务器

    初代目由于承载能力的限制,衍生出了第二代游戏服务器,目的就是为了增加并发,开始使用了多线程多进程的模型,逻辑上也开始增加了分区分服的结构。代表作有《UItima》,中文名叫《创世纪》。

    2000年,联众的休闲棋牌。

    在 2003 年年底,联众游戏世界的注册用户一度超过2亿,月活用户达1500万,中国网络棋牌游戏的绝对霸主,但是 2003 年下半年,腾讯公测 QQ 游戏大厅,功能与游戏门类与联众大同小异,QQ 游戏大厅不同在于,每次你的 QQ 好友在游戏大厅玩游戏时,他的头像下方就会显示他正在玩什么游戏,这个状态栏一点开,你就能跟他一起玩了,就这么一点小细节,让联众游戏世界和 QQ 游戏大厅的用户流量在一两年里发生了戏剧性的此消彼长。2006年,彻底败北的联众创始人辞职,之后他成为投资人,坚持只做腾讯不做的项目。

    第三代游戏服务器 - 三层架构

    第三代游戏服务器就比较百花齐放了,首先就是当时流行的三层架构,抽出 Gate Server 的部分去负责网络 IO 连接的部分,然后 Gate Server 通过一个内部的网络 IDC 的专网跟游戏逻辑服务器之间交互,最后把用户数据的存储放到 DB Server 这一层。 总的来说,三层架构它的主要特点就是把网络 IO 和存储跟逻辑分离,这样可以对每一层进行扩展,增加服务的承载能力。QQ 游戏大厅就是比较典型的代表。

    第三代游戏服务器 - 服务器集群

    这种架构前面同样也是有 Gate Server 这种接入型服务来处理外网连接,然后在游戏 world 里去处理游戏逻辑。它与三层架构不同的是,它会把通用逻辑抽取出来,例如登录、聊天、组队、工会等,放在独立的位置,通过 cluster 集群的方式提供这种游戏服务,调用者通过调用函数来获取对应的功能。大部分的 MMO-RPG(MMO:Massive Multiplayer Online,大型多人在线游戏) 、RPG(Role Playing Game:角色扮演) 游戏都是这种结构。 这种方式,中间肯定就多了一些异步的交互,异步交互就会带来状态维护的问题,开发难度也随之提高。代表游戏有《地下城与勇士》。

    第三代游戏服务器 - 无缝地图

    这个类型的游戏,最大的代表游戏就是《魔兽世界》,相比以前的《传奇》类型的游戏,它切换地图的时候,客户端会明显的卡顿或者进入 loading 界面。无缝地图的特点就是玩家在游戏中移动时,会看到地图一直都在不停的加载,因为它的场景服务器只负责一部分场景,玩家移动到某个地方时,场景可能存在两个场景服务器上。这些场景服务器会由一个更高层的服务器来决策由哪台服务器加载场景。

    第三代游戏服务器 - 房间型

    比较常见的游戏类型都会使用这种模型。它通常有一个大厅集群,它通常负责前面提到的 Gate Server 用户的接入,还有一些大厅的逻辑服务,例如 5V5 匹配,有多个玩家申请进游戏的时候,它会根据匹配规则,等级啊,玩家的技术啊来撮合两个队伍。然后,单局的过程会放到战斗集群,也叫做房间服务。代表游戏有腾讯的《英雄联盟》,《英雄联盟》把电竞行业也推到了一个前所未有的高度,想到以前高中和兄弟们一起开黑,真是快乐。

    核心技术和实现难点

    游戏服务器技术跟客户端比较,客户端主要在用户交互和体验表现方面。而服务器则是要面对海量用户,十万到千万的 PCU,PCU 是游戏里面,用户数据的一个指标,Peak Concurrent Users 最高同时在线玩家人数,还有 DAU Daily Active User 每天登录过的用户,PCU 比较考量服务器的性能数据,DAU 更倾向运营数据。

    稳定,服务器玩的时候不能宕机,还有就是容忍一些弱网络的问题,网络断了,允许他在短时间内 WIFI - 4G 的切换。

    地图&视野同步,地图服务功能,服务器最常用的是九宫格技术,一块九宫格的内容,玩家在其中格,这个格往往比屏幕大一点,会收到这个格里面的内容,一般服务器会认为你在这个九宫格内,所有的玩家、怪物等都是你关注的对象,当你在一个格内移动时,视野是不会发生变化的,但假设移动跨格后,那么就认为玩家放弃了上一个九格宫中关注的内容,在客户端将不可见上一个格子中的内容,在服务器角度仍然可见。目的就是用户在移动的过程中比较平滑的加载数据,减少交互的数量。地图管理还包括一些动态阻挡,比如两个人走到同一个点,能够挤在一起还是重叠。还有就是静态阻挡,一个物件放置在那里,服务器要判断玩家能否走过去。移动中,主要问题还在延迟、拉扯、平滑、差值。

    最后游戏中非业务的难点还有存储、缓存、反外挂、网络协议等。我根据目前我的技术栈来列举。如下。

    开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天, 点击查看活动详情

  •