由于服务器后端涉及的逻辑往往比较繁杂,重新搭建一套底层的游戏服务器框架需要较大的人力与时间投入,若设计不合理还将面临后期修改的一些系列问题。为了提升开发效率,大部分开发者都会选择一些第三方的开源游戏服务器框架,并在其基础上进行开发。国内的社区论坛想github上开源的第三方的服务器开源框架还是非常多的,比如skynet、网易的Pomelo都是国内比较知名的开源框架。
不过对于不少中小团队的而言,开源框架技术支持是一个很大的问题,遇到的技术问题需要自己去摸索,且无法得到及时的技术支持,最终影响有限开发效率。游戏愈加轻量化的趋势下,开发者对于联网游戏的快速开发与后续稳定性维护有着很高的诉求。下面我们以商业化游戏服务器引擎Matchvs为例为大家进行讲解。
一般而言,商业化游戏服务器引擎是在开源框架的基础上进行进一步的封装。将这些功能的集成一个高可用的API,开发者只需要调用这些API ,根据自己的游戏逻辑修改对应的参数即可。相对于开源框架,这意味着即便是没有服务端开发经验的工程师也能在很短的时间内容搭建一款具有标准的联网对战游戏。
试想一下如果重头开发一款联网对战游戏,仅仅是为了解决玩家间简单的数据收发,开发者往往就需要解决协议商定、服务框架选型、匹配、房间管理逻辑的设计与实现、高效数据转发、以及弱网环境优化、服务器采购、服务高可用实施等诸多问题。而以上每个问题可能都需要有相应实践经验的人才能解决。
因此,一款商业化的游戏服务器引擎应该包括 SaaS + PaaS + 引擎适配三个部分:
开发者通过SaaS层提供的API,即可完成“就近”节点接入、玩家匹配、游戏数据通信的建立;PaaS提供多种常见语言的GS开发框架、托管平台,游戏开发者无需自有服务器资源即可扩展Matchvs引擎联网能力,实现自定义的服务端逻辑;引擎适配层使得开发者无论使用cocos、Unity、还是白鹭、laya等游戏引擎都能快速、方便地接入,降低开发者学习成本、提升开发效率。
整体架构如图
1 SaaS:
SaaS层由SDK和后端服务组成,开发者通过SaaS 层提供的API,即可完成就近区域节点接入、玩家匹配、游戏数据通信的建立。
MVS集群(set):提供匹配、对战能力的服务(模块)集合,Set也是全服调度的基本单位。一个完整set包括了玩家接入、对手匹配、游戏数据传递、GS扩展等功能,与此相对应可将模块划分为1接入层;2业务层;3基础服务层;4 GS层,MVS集群(set)组成可参见如下结构图:
1.1 区域调度服务
游戏作为延迟敏感型应用,尤其是FPS、MOBA类游戏对延时要求更为苛刻,能提供多区域节点覆盖和玩家“就近”接入就显得尤为重要。引入区域调度服务的主要作用包括:(1)实现用户“就近”接入,降低用户延迟,显著提升对战游戏体验;(2)CP可顺应市场需要、针对玩家分布合理选择部署区域;
区域调度服务与SDK配合用于指导、调度客户端接入不同set的全局服务。主要有如下三个功能:用户甄别;多区域列表下发、接入推荐; 接入效果反馈、查询;
1.2 匹配与对战服务
一般来说基于“房间”模式的联网对战,游戏流程包括两个阶段: 1 匹配(matchmaking) 2 对战(gameplay)。匹配是指将满足一定规则的玩家“撮合”到一起进行游戏,不管是Android、iOS还是web都是可以匹配到一起的,具体匹配策略可由游戏开发者通过匹配API的具体参数来指定;对战是指匹配成功的玩家通过SDK提供的接口同步玩家操作、游戏状态等数据以支持同一房间内玩家对战和互动。
在Matchvs联网引擎中我们将和房间匹配相关数据称之为“控制流”,将房间内游戏对战数据称之为“数据流”,显然这两种不同类型的流对带宽、延时等指标容忍度不同,下图说明了set内的控制流和数据流的流向和分离情况。
为了便于开发者上手,我们将API分为基础联网和扩展两部分,使用基础接口开发者即可实现基本的匹配和对战功能,而使用扩展接口开发者可以完成更复杂、更定制化的功能。
2. PaaS与GameServer
PaaS提供多个语言版本的GS开发框架、托管平台,开发者无需自有服务器资源即可对引擎联网能力进行扩展,实现自定义的服务端逻辑;
2.1 GS架构
GameServer和引擎的高交互性,以及游戏低延迟的要求,决定了GS和引擎最好物理上接近。Matchvs游戏云提供的GS托管服务实际是一个类似heroku的PaaS服务(提供了应用程序的开发、运行环境),作为一个服务众多CP的PaaS平台,在Matchvs引擎引入GS需要解决如下几个关键问题:
(1)不同语言、框架依赖、运行环境如何满足?
(2)多个CP的GS如何管控,资源如何限制和分配?
(3)自动化的缩、扩容、监控、高可用如何保证?
针对上述问题,我们将CP开发的GS容器化,通过基础镜像来解决框架、依赖等环境差异的问题;将GS统一纳入K8S集群,使用namespace隔离不同CP资源调度、分配;GS被抽象成service形式存在,使用K8S的对应扩容、高可用机制。
2.2 GS SDK框架和GS接口
gameServer 与Matchvs server之间使用基于长连接、二进制协议的高性能RPC组件通信,能很好地支持 Matchvs 全双工低延迟通信、验证授权等功能要求。 gameServer framework 主要提供了以下功能:
- 接收并处理房间匹配、对战数据等消息;
- 为gameServer SDK提供主动推送数据的能力;
- 在独立部署方案下,向Matchvs注册gameServer。 gameServer SDK提供面向开发者的房间、玩家、对战数据等API接口。开发者能够以此获取并控制每一个房间和玩家的状态,从而实现更丰富的游戏功能。 自定义服务端逻辑。开发者基于gameServer SDK实现定制化的功能,例如控制游戏进程、仲裁、数据持久化等等。