> 文章列表 > 【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

【从零开始学Skynet】实战篇《球球大作战》(一):功能设计

         为了能把之前在基础篇中学习到的Skynet的各种知识结合起来,所以在实战篇中,我们准备开发一个完整的游戏案例《球球大作战》,介绍分布式游戏服务端的实现方法。

1、功能需求

        《球球大作战》是一款多人对战游戏,下图是它的战斗场景示意图。玩家控制一个小球,让它在场景中移动。场景会随机产生食物,小球吃掉(碰到)食物后,体积会增大。数十名玩家在同一场景对战,体积大的玩家可以吃掉体积小的玩家。

 2、游戏流程

  • 玩家输入账号密码登录游戏;
  • 进入如下图所示的界面,可以设置本轮游戏的昵称、选择服务器;
  • 当玩家点击界面中的“开始比赛”按钮时,会进入某一战斗场景,在这里可与其他玩家对战。

         我们即将开发的这款游戏,预估会有数万到数十万玩家同时在线,所以服务端也要根据这个量级来设计。

 3、方案设计

        要支持数以万计的在线玩家,必然要采取分布式的设计方案。     

 (1)拓扑结构

        我们设计了如下图所示的服务端结构,其中圆圈代表服务,圈内文字指明服务的类型和编号,比如“gateway1”代表“gateway”类型的1号服务

 此服务端结构有如下特点:

  • 可以支持多个节点横向拓展。理论上,只要开启更多节点,就能够支持更多玩家;
  • 符合Skynet设计理念。每个服务都是轻量级的,功能单一,通过多个服务协作完成服务端功能;
  • 每个节点被划分成两部分,其中,用虚线方框围起来的称为“本地”服务,方框外的称为“全局”服务。
类型 说明
本地服务

        在单节点内是唯一的,但是它是不具备全局唯一性的服务,比如图中节点1节点2都有login1,每个节点都可以开启一个login1,它们各自独立

全局服务         是在所有节点中都具有唯一性的服务。比如图中的agentmgr,可以把它部署在节点1,或者节点2上,但是无论如何,所有节点只能开启一个

(2)各服务功能

        服务端包含了gateway、login等多个类型的服务,它们的功能如下表所示:

服务 说明
gateway

        即网关,用于处理客户端连接的服务。客户端会连接某个网关(gateway),如果玩家尚未登录,网关会把消息转发给节点内某个登录服务器,以处理账号校验等操作;如果登录成功,则会把消息转发给客户端对应的代理(agent)。

        一个节点可以开启多个网关以分摊性能。

login

        指登录服务,用于处理登录逻辑的服务,比如账号校验。

        一个节点可以开启多个网关以分摊性能。

agent         即代理,每个客户端会对应一个代理服务(agent),负责对应角色的数据加载、数据存储、单服逻辑的处理(比如强化装备、成就等)。出于性能考虑,agent必须与它对应的客户端连接(即客户端连接的gateway)处在同一个节点。
agentmgr         管理代理(agent)的服务,它会记录每个agent所在的节点,避免不同的客户端登录同一账号。
nodemgr         指节点管理,每个节点会开启一个nodemgr服务,用于管理该节点和监控性能。
scene         即场景服务,处理战斗逻辑的服务,每一局游戏由一个场景服务器负责。

(3)消息流程

        从客户端发起连接开始,服务端内部的消息处理流程如下图所示(这是个简化图,忽略了nodemgr)。

  • ​​​​​​​ 登录过程:

        在阶段①客户端连接某个gateway,然后发送登录协议。gateway将登录协议转发给login(阶段②),校验账号后,由agentmgr创建与客户端对应的agent(阶段③和④)完成登录。如果该玩家已在其他节点登录,agentmgr会先把另一个客户端顶下线。

  • 游戏过程:

        登录成功后,客户端的消息经由gateway转发给对应的agent(阶段⑤),agent会处理角色的个人功能,比如购买装备、查看成就等。当客户端发送“开始比赛”的协议时,程序会选择一个场景服务器,让它和agent关联,处理一场战斗(阶段⑥)。

(4)设计要点

  1、gateway

        这套服务端系统采用传统C++服务器的架构方案。gateway只做消息转发,启用gateway服务有以下好处:

  • 隔离客户端与服务端系统。如果要更改客户端协议(比如改用json协议或protobuf),仅需更改gateway,不会对系统内部产生影响。     
  • 预留了断线重连功能,如果客户端掉线,仅影响到gateway。                       

        然而引入gateway意味着客户端消息需经过一层转发,会带来一定的延迟。将同一个客户端连接的gateway、login、agent置于同一节点,有助于减少延迟。

2、agent和scene的关系

        agent可以和任意一个scene通信,但跨节点通信的开销较大。一个节点可以支撑数千名玩家,足以支撑各种段位的匹配,玩家应尽可能地进入同一节点的战斗场景服务器(scene)。

3、 agentmgr

        agentmgr仅记录agent的状态、处理玩家登录、登出功能,所有对它的访问都以玩家id为索引。它是个单点,但很容易拓展成分布式。