引言
今天给大家介绍的课程主要是游戏服务器的基本概念,包括什么是游戏服务器、游戏服务器的发展与分类以及其核心技术实现难点。
什么是游戏服务器
游戏服务器的起源
需求 | 解决 |
---|---|
换电脑不需要重头开始游戏,游戏要有成长性 | 有一个地方存储玩家数据以及剧情状态 |
可以和其他人一起游戏,与人斗其乐无穷 | 有中转的电脑转发玩家的操作、状态 |
防止他人作弊,保证游戏内公平性 | 有裁判、校验玩家的操作,维持公平性和游戏性 |
简单总结一下游戏服务器就是:承载游戏服务的硬件 + 提供游戏服务的软件。
游戏服务器的功能
- 网络服务:终端网络连接的建立和会话维护
- 用户数据存取
- 游戏逻辑计算
- 用户行为或者状态变化的同步
游戏服务器相比互联网服务的特点
- 延迟敏感
- 实时高强度交互
- 业务逻辑复杂,内部耦合度高
- 变更频度高、幅度大
游戏服务器和分类发展
网络游戏发展史
第一代服务器
第一代游戏服务器使用早期原始的单进程,单线程服务器原型。
第一代联机游戏 MUD1(1978)主要采用文字叙述方式,进场景后服务器告诉你在什么场景,你有什么数据等等交互,玩家输入一些指令。
第二代游戏服务器
承载能力的限制促进了第二代游戏服务器的发展,在服务端使用了多线程多进程模型,在逻辑结构上增加分区分服的结构。
比较典型的是 Ultima Online(1997),它是世界上第一款图形界面的大型多人在线游戏。
联众的休闲棋牌(2000)与地方合作搭建服务器,属于典型的分区分服的服务器架构。
第三代游戏服务器
第三代游戏服务器更加百花齐放。
三层架构
第一种是第二代演变的三层架构服务器:
- Gate sever 负责连接部分
- Game sever 通过内部网络与游戏逻辑服务器交互
- DB server 接收用户和游戏数据
主要特点是三层架构把网络与磁盘 IO 分离,可以对每一层进行扩展。
QQ Game(2003)是这种架构比较典型的代表,峰值在线人数可以达到 800+ 万。
服务器集群
大部分 MMORPG 都采用这种结构,将不同逻辑分组。
传奇(2001)是一款非常有代表性的 MMO 作品。
无缝地图
无缝地图特点:
- 单 scenesvr 只负责部分场景,切场景可能需要变换服务器
- 玩家进入游戏后没有加载地图过程
- 玩家在场景边缘数据可能存在于几个 scenesvr,管理复杂
魔兽世界(2004)是典型代表。
房间型服务器
平时的游戏匹配采用的是这种房间型服务器。
代表游戏有 英雄联盟(2009)、王者荣耀(2015)和 刺激战场(2018)。
核心技术和实现难点
游戏服务要解决的核心问题
满足海量游戏用户的稳定和高质量的服务要求
- 海量:十万~千万 PCU(同时在线用户),亿级注册用户
- 稳定:相对于宕机、网络和计算卡顿
- 高质量:快速–网络延迟;逻辑严谨–更新频率和及时性
核心技术和实现难点
- 单服处理能力
- 逻辑耦合度高,异步协同 + 状态维护
- 延迟敏感
- 版本更新
系统结构示例
上图是一个偏向于房间型结构的游戏服务器示例。
网络协议
TCP
面向流的模型。协议没有边界,如果丢包会影响传输速度
UDP
点对点,丢包影响传输成功率
R-UDP
HTTP
接入逻辑 目录服务
地图 & 视野同步
服务器中最常见的地图 & 视野同步是这种九宫格技术,比较平滑的加载同步数据,保证用户行走平滑并且减少交互数量。
商品购买
商品购买服务一般视为异步状态机,如果中间过程中断可以以任意状态回滚。
DB层
游戏服务进程框架
一般游戏服务器的进程框架和大部分服务进程相似,中间一直在循环处理。
反外挂
- 在中国,由于人口基数和社会问题,反外挂问题也成了网络游戏生命的核心问题。死在外挂上的游戏已经包括了《传奇》,《疯狂坦克2》
- 外挂包括键鼠模拟,注入,协议破解,程序破解等方式,有些甚至可以是完全脱机
- 反外挂的核心是服务器逻辑为主
- 防外挂手段包括动态协议栈,验证码检查,加壳,动态特征码检查进程等方式
设计原理与方法论
KISS原则
- KISS == Keep It Simple,Stupid
- 系统设计尽量简单,减少模块耦合
灰度
- 柔性可用
- 在不同的场景下提供不同的服务
- 服务降级 灰度分布
一些已验证可行的具体技术
- 无锁通信队列
- 异步模型
- 通用框架
- key-value 数据库产品或者内存数据库
性能分析工具
网络抓包工具
现状和前景
- 多核时代
- 编程时代
- 更真实的游戏世界
- 更实时的交互
- 更快的响应速度