游戏服务器开发技术小结

1 概述

本文从开发者的视角,浅析游戏服务器开发涉及到的几个技术层面,并说明这几个层面我们可以选择的解决方案。

一般地,会把游戏服务器的架构划分如下三层:网络接入层、游戏逻辑层、数据存储层,这样划分的主要目的是:

  • 将底层通信与业务逻辑处理解耦合;
  • 将业务逻辑处理与数据存储解耦合;
  • 有利于运营部署与扩展;

游戏服务器开发框架整体视图,如下所示:

游戏服务器开发技术小结

2 网络接入层

网络接入层主要任务是解决来自客户端大量并发请求和负载均衡的处理,考量该层的主要性能指标是:高吞吐、低延迟、均负载,即既能同一时刻处理大批量的客户端请求(每秒至少1万个请求以上),又能快速响应,并且均负载的分布处理这些请求。

本层的基本技术要点如下图所示:

2.1 高并发处理

2.1.1 http接入

(1)优点

  • 低成本:有成熟的开源webserver;
  • 快速开发的效率:一请求一应答的协议通讯,使用游戏逻辑处理相当简单;
  • 低门槛:基于web的应用,玩家无需下载客户端,也不用担心防火墙等问题;

(2)不足

  • 难以处理服务器广播事件;
  • 文本协议会占用较大流量;

2.1.2 socket接入

(1)优点

  • 功能强大:能灵活处理服务器广播事件;
  • 高效通信:二进制协议较文本协议能大幅度节省带宽,并且通信包可做组播等处理,以有效降低流量;

(2)不足

  • 实现成本较高,开发难度较大;
  • 可能会遭遇部分办公室玩家的机器通讯端口被屏蔽,无法穿透防火墙等问题;

2.2 IP路由与负载均衡

这块跟服务器集群和IDC部署密切相关,主要是为了让整个服务器集群能最大化其处理能力,尤其是在业务高峰时期,整个服务器集群能均衡平滑的应对客户端请求,不至于出现某个单点服务器出现很高负载时,其它同层服务器较空闲的情况。

目前,这块公司和开源界都有很成熟的解决方案,故在此不多赘述。

2.3 应用场景

  • 目前市面上绝大多数的Social Game和SLG类的WebGame均采用http通讯;
  • RPG类的WebGame和有源客户端网游均采用socket通讯;

3游戏逻辑层

游戏逻辑层主要是处理游戏的具体业务逻辑,根据游戏类型和部署的不同,它会由一个或多个进程组成。其主要组成可由下图说明

3.1 基础系统

基础系统包含的内容基本上为各个游戏业务逻辑所公有的东西。

  • 游戏对象内存管理:这是业务系统中最基本也是最重要的系统之一,目前,我们采用基于共享内存的预分配机制,来管理游戏中各个对象所需内存的分配与回收。这样的好处是,当游戏服务器进程Crash时,配合运营的实时监测机制,系统自动拉取Crash进程后,在线玩家的状态数据可以无损恢复,并且在线玩家不会感觉到服务器宕机;
  • 消息分发管理:集中处理CS消息和SS消息,设计时重点考虑程序的可扩展性;
  • 系统与运营日志管理:分别用来监控服务器状态和玩家的各种行为;
  • 游戏商城管理:对付费物品的上架、扣除、计费等处理;
  • 玩家登录管理:玩家登录游戏时的流程统一处理;

3.2 业务系统

业务系统主要是说明游戏的主体内容是由哪些子模块组成,这跟具体的游戏类型关系较大,这里抽取出大部分游戏应用的业务模块。

  • 地图与副本管理:游戏各公共场景和玩家独自的副本地图的处理,包括Npc与怪物分布、传送点分布、地图阻挡数据等的解析,以及地图实例和副本实例的抽象等;
  • 移动管理:主要是实现游戏对象(玩家角色、怪物等)的地图寻路、障碍物检测,以及动态碰撞处理等功能。
  • 装备与道具管理:主要包括装备的合成、拆分、打造、镶嵌、升星等,以及道具的获取、交易、使用等功能;
  • 任务与事件管理:主要包括任务的领取、任务节点的更新、任务的完成和失败处理等,以及系统随机事件的产生等内容;
  • 游戏世界状态管理:可将整个游戏世界各游戏对象的状态分成几大类与几小类,如:玩家角色的状态、技能Buff的状态等,然后对各状态之间关系进行统一管理;
  • 战斗与技能管理:处理PVE、PVE战斗流程、伤害计算,以及各个技能、Buff、Debuff的业务规则处理;
  • Npc与怪物AI管理:包括Npc在场景中的分布规则和本身的功能处理,以及怪物的分布、刷新、各类AI行为的处理;
  • 视野管理:包括玩家的视野、Npc和怪物的视野等,设计时需要特别注意考虑各个不同场景中玩家的视野大小和视野搜索网格大小这两个重要参数,因为,它们对服务器的性能(CPU和流量)影响很大;
  • 宠物与坐骑管理:包括宠物和坐骑的养成、交易、附带技能和装备等功能;
  • 社会关系管理:包括玩家组队、玩家好友、玩家交易、家族、公会、阵营、国家等社会关系功能的处理;
  • 邮件管理:通过邮件可实现发送系统消息、发放系统道具,玩家道具交易等功能;
  • 聊天管理:包括玩家点对点聊天、群聊等功能;

 

4 数据存储层

数据存储层是整个服务器的关键基础系统之一,因为游戏服务器的核心功能之一就是存取玩家数据。游戏类型不同,对数据的存取需求也不一样,对于传统客户端MMORPG而言,一般采用Mysql作数据持久化,然后在Mysql与GameSvr中间实现一个ORM的服务提供数据的代理或缓存即可。而新兴的Social Game和强交互的WebGame,则选择用NoSql来替代Mysql,以满足其超大规模IO并发的需求。如下图所示:

4.1 ORM

ORM即为对象关系映射,可以这样来简单的理解:我们平时操作关系型数据库,需要业务自己编写许多数据访问的代码,这样会把许多SQL语句直接暴露在业务代码里,十分不利于维护。利用ORM技术,可以避免这个问题,即业务逻辑不会直接对DB进行操作,而改由ORM来完成,业务逻辑与ORM服务之间约定相关协议和API接口,来完成对数据的增、删、改、查等功能。

4.2 NoSql

NoSql,指的是非关系型的数据库,它可以满足对数据库的高并发读写、对海量数据的高效率存储和访问,以及对数据库的高可扩展性和高可用性等需求,它是随着SNS和Web2.0的兴起而产生的新兴存储技术。对于游戏而言,目前它主要应用于Social Game和强交互的WebGame中。

5 通用组件库

通用组件库是指那些与具体业务无关的,能应用于所有服务器开发的组件库。目前,我们所积累的可归纳如下图所示:

5.1 后台服务应用框架

后台服务应用框架规范了进程的起停方式、信号处理、命令行参数等操作,框架本身实现了一个daemon服务所必备的消息主循环、reload机制,以及定时器处理等功能。

5.2 日志组件

日志是服务器调试和定位Bug的主要手段之一,日志组件一般需要实现日志分级、异步写磁盘、以及按日期时间分类等功能。

5.3 进程间通讯组件

进程间的通讯也是服务器的核心基础功能之一,高效的进程间通讯是服务器性能的基本保障,进程间通讯组件需要实现同机器与跨机器的进程高效通讯。

5.4 消息打包组件

在许多通信程序中,需要定义一套网络协议,并需要根据网络协议对协议数据单元(PDU)进行Pack/Unpack,以实现可移植性和网络传输的可靠性及效率。但是对协议数据单元进行Pack/Unpack是一个重复性很强的操作,繁琐而且容易出错(Pack和Unpack容易不匹配)。而消息打包组件则简化了网络协议的制定,使得业务应用不用关心协议的Pack/Unpack操作,并且支持良好的数据扩展和协议版本兼容。