网络游戏的基本架构

游戏的最大价值就是可玩性,为了保持游戏的可玩性,游戏必须具备能够“顺畅进行”的特性,而网游还需要能够“快速响应”。本文前半部分先讨论如何维持网络游戏的可玩性,后半部分说明了网络游戏常用的物理架构(C/S、P2P)和逻辑架构(MO、MMO)。

1. 网络游戏编程的特性

1.1 游戏客户端的特性

视频游戏的最大特点是:为了最大限度发挥其可玩性,必须流畅地持续进行实时的高速处理,网络游戏程序还必须始终保持高速响应。为了达到这种要求,一般会将实时的数据存放在内存中(而不是在数据库中),这是因为:

  • 游戏数据要在“16毫秒”即1帧这一短暂的时间内持续变化
  • 需要同时显示大量对象
  • 不知道玩家会在什么时候进行操作,所以无法事先计算

1.2 网络游戏客户端的特性

  • 通信延迟低:不同类型的游戏对延迟的要求不同,但均无法避免由地域距离所带来的延迟
  • 控制带宽传输量:C/S MMO每人10kbit/s~100kbit/s,P2P MO为前者的3倍
  • 服务器成本估算:C/S MMO每台服务器有1000~3000个并发连接,P2P MO为前者的3~5倍
  • 安全性:防作弊,放破坏
    1. 动机:纯粹个人利益、与其他玩家相关的利益、与运营公司相关的利益
    2. 作弊手段:内存破解、数据包破解、数据文件破解、时钟破解、UI工具自动模拟、服务器攻击、伪造客户端
    3. 作弊的操作对象:本地内存和文件、其他玩家的内存和文件、数据中心服务器的内存和文件、本地和其他玩家之间的数据包、本地和中心服务器之间的数据包

2. 物理架构详解

主流的网络游戏物理架构,大致可以分为C/S架构和P2P架构。网络拓扑结构主要使用星型(包括总线型)以及全网状结构(每个节点均和其他所有节点连接)。采用这些结构,主要是因为相对于游戏的容错性和吞吐量,优先级最高的还是要把通信延迟降至最低。

对于C/S架构,又分为纯服务器型和反射型,前者服务器会对各个客户端发送来的数据进行检测,后者只是单纯转发数据。对于P2P架构,有同步和异步两种方式。此外,还有C/S+P2P混合型架构和ad-hoc模式,因为比较少见,不赘述。

3. 逻辑架构详解

  • MO(Multiplayer Online):同时在线人数2~100人,游戏时间较短,一般在几个小时,每次开始游戏时,游戏状态都会被重置,游戏数据时一次性的。适用于FPS、RTS等在线人数较少,实时性很高的游戏。
  • MMO(Massively Multiplayer Online):同时在线人数达数百、数千以上,游戏时间长达几十个小时,也不能重置游戏数据,游戏数据时永久性的。
  • MMO和MO混合:根据游戏策划内容,有时需要采用这种混合架构,例如在MMO游戏的某些供少数人在短时间内重复进行游戏的特殊地图,会采用MO架构。

3.1 MO架构

3.1.1 同步方式与全网状架构

参与游戏的所有终端都拥有主数据,这些终端只互相传输所有的控制设备输入信息,在获得所有终端的输入数据之前,游戏始终处于等待状态。这种架构要成立,必须满足这些条件:初始状态完全相同;所有输入信息数据包都确确实实毫无遗漏地发送到其他所有终端;游戏过程数据不会随机变化(伪随机数没有问题);游戏过程数据变化不会发生波动。要满足这些条件并不苦难,但这种架构依旧有如下问题:

  1. 人数增加后,收发信息完整性极易崩溃。根据“混沌理论”,即使是细微的差异,经过不断重复单纯的规则,最终也会产生截然不同的结果。
  2. 最慢的终端会拖长整体的传输时间(同步方式都会存在)
  3. 不能中途加入游戏(同步方式都会存在)。因为在中途加入游戏的一刻,为了传输游戏状态数据,所有玩家都必须长时间暂停游戏。

3.1.2 同步方式与星型架构

网络中的一个玩家终端A充当服务器,客户端将控制设备上的输入信息发送至服务器,服务器在接收完所有数据前一直处于等待状态,接收完成后将信息同时发送给所有客户端。这种方式的最大优点就是,所需增加的传输线路与所增加的玩家数成正比,传输线路不会爆发性增长。但依旧有如下问题:

  1. 响应较慢
  2. 若玩家A中途离线,游戏无法恢复,只能强行终止
  3. 程序结构比全网状结构稍微复杂
  4. 玩家A终端上的传输负荷比其他终端高出很多,不公平

3.1.3 异步方式

异步方式下,各个终端的游戏状态是不同的,必须在游戏数据的一致性方面做出妥协。由于这种妥协,异步方式下可以使用更加不稳定和延迟更大的传输线路,也可以支持更多的同时在线数。另一方面,程序相比同步方式会略显复杂,且有些情况下游戏体验更差一些。在实现方面,对游戏数据做出何种妥协完全依赖于游戏的具体内容。异步实现的指导方针是:将游戏世界的基本要素分为三大类,即自己的状态,对手的状态和环境状态。这三大类之间的两两关系又需要分别对待处理,此处不赘述。(具体参见《网络游戏核心技术与实战》3.4.7-3.4.13)

3.2 MMO架构——浏览器方式

MMO游戏也被称为“持久的游戏”,因为其累计的游戏时长可能高达数千个小时。为此必须在服务器的内存和磁盘上准确无误地完整地保存各种游戏数据,当玩家需要时瞬间取出来展现给玩家。因为数据一致性方面的要求非常严苛,所以在构建系统时要将客户端和服务器完全分离。在MMO架构中,客户端将控制设备输入信息发送给服务器,服务器只想客户端发送游戏过程中的结果,客户端则把游戏结果可视化展现给玩家。这就是逻辑架构中所谓的浏览器方式。

在这种架构下,即使没有客户端,游戏也会在服务器上持续运行,所有的逻辑都在服务器上处理,而客户端只进行与渲染、音效、输入有关的处理。

最后,总结比较一下3种逻辑架构之间的差异:

  • 浏览器方式和同步方式:最大差异在“传输内容”,即同步方式下收发的都是玩家输入信息(原因),而在浏览器方式下,客户端发送玩家输入信息(原因),服务器发送游戏过程的结果。
  • 同步方式和异步方式:两种方式下,所有终端都共享游戏过程的所有主数据

参考文献:人民邮电出版社《网络游戏核心技术与实战》第3章

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器