游戏服务器架构简述

多人在线游戏服务器构架

当今的网页游戏也越来越强调及时性, Server 的负载过重也会造成 Server 与 Client 之间 的不同步而导致延迟的出现,因 Server 较晚回应给 Client,玩家的动作会因此变慢,因此造 成很多玩家感觉游戏本身的游戏性较差而造成大量流失玩家,下面就将次问题讨论 Server 负载与解决之道!

传统线上游戏系统架构

主要有四种:Client/Server、Peer2Peer、Hybrid Client/Server 及 Multi-Server,不同的游 戏拥有不同的架构,具体情况具体分析。

一、Client/Server 架构

N 个 Client 连接至一个 Server, Client 只负责将玩家输入的信息发送给 Server, Server 处理大部分运算并将处理结果发回给 Client。

优势:设计简单,玩家作弊情形不容易发生

劣势:由于整个运算都是在 Server 端进行,所以 Server 的运算能力及网络的流量 是真个系统的瓶颈,当 Client 没有收到 Server 的任何信息前,Client 无法对玩家的输入 做出任何反应,画面也无法及时更新,因此容易因 Server 运算延迟或网络延迟,造成 游戏的不流畅,一旦 Server 达到上线或者 Client 增多时,则必须考虑使用功能强大的 Server 来取代。

二、P2P 架构

点对点构架最大的优势就是及时性,没有 Server 的介入,所有消息都是参与游戏 的电脑之间的做资料的传送。 这种构架避免了不必要的传送延迟, 但是要在网络环境上建立点对点的架构, 那么 每台电脑必须对所哟的电脑先建立连线并做出传输的处理, 因此电脑的运算能与连线的 频宽会造成不小的负担。

三、Hybrid Client/Server 构架

此构架的特点在于 Client 可以自行推测目标的状态, 并且可以立即针对玩家的输入 做出反应。这种构架把整个虚拟世界当成一个由所有玩家共同享的资料库,Client 可分 到部分资料库类容,并且可以依照资料对玩家的输入与玩家在游戏中的状态进行推测, 兵即时的反应给玩家。

因此如果 Client 尚未收到 Server 信息, Client 端依旧可以进行 则 游戏,但是最终数据的决定全仍然掌握咋 Server 中,如果 Client 的自行计算结果与服 务器的结果不相符合,则 Server 便会去修正 Client 的状态。此架构最大的问题在于网 络延迟所带来的影响, Client 和 Server 之间传输延迟过大, 若 则将会导致 Client 端所推 测的资料库内容与 Server 端的资料库内容差距过大。

四、Multi-Server 架构

早起的 mmorpg 游戏是有单一的 Server 负责整个游戏的内容, 由于是单一的 Server, 因此游戏中能够容纳的线上人数及玩家间的互动会受到限制。 而在 Multi-Server 构架中, 通过每一个 Server 负责一个部分的游戏的内容,但是在不同的 Server 上玩家长处于不 同的游戏世界里, 因此无法互动, 为了要提高系统整体的效能有效利用系统的运算及频 宽的资源,一半以空间切割的方式分配 Server 权限范围及适当划分 Server 负责的工作, 是不同的 Server 负责不同区域间的玩家,因此能支持更多的线上玩家。

目前 mmorpg 逐渐采用 Multi-Server 方式来减少 Server 的负载以及减轻网络的频宽 限制。目前使用的 Multi-Server 分工的技术,大多采用空间切割的上市将虚拟世界的地 图切成跟 Server 同等数量的片段, 再将地图的片段分配给每一台 Server。 当玩家靠近地 图片段的边界时, 玩家所在的 Server 会通知临近的地图片段的 Server, 那么在最佳的情 况下网络流量在这两个 Server 之间为零流量, 没有玩家通过这两个 Server, 而最差的情 况为 O(m^n) 为玩家的数量,m 为 Server 的数量。 ,n

MMORPG 负载均衡机制

1.静态分布玩家到服务器 平均分配玩家给每个 Server, 使每个 Server 有相同数量的玩家。 这种方法 的优点是算法简单,但玩家在地图上移动,因此过一段时间,最差的情况下, Server 之间可能有大量的网络流量,因为当玩家在完成一个动作后,所有的 Server 必须获得另一个 Server 的玩家数据, 而其附近的玩家皆在不同的 Server 上,如此依赖,每个玩家的一个动作需要传送消息到不同的 Server 上,将造 成 communication 的极大负担。

2.静态分配地图片段到服务器 利用空间切割的方式将虚拟世界切割成和 Server 同等数量的地图片段, 再将这些地图片段分配给每一个 Server 负责,然后再有一个 Dispacher Server 负责将每一个玩家分配到所对应的 Server 上去,但由于玩家会在地图上移动, 因此时间一久,在最差情况下,玩家可能都到同一个 Server 的地图片段上, 这样当初的负载平衡就完全被破坏了。

3.动态分配地图片段到服务器 静态分配地图片段至每个 Server 虽然可以减少 Server 间网络的频宽和负 载,但必须使玩家在正确的分布地图上,玩家的位置是由玩家所操作的,因此 会发生不可预料的问题,为了克服这类问题,将地图分切成更小的片段,然后 动态的分配地图片段至 Server 上是需要的。然而这种方法要有效率,其关键 在于如何切割地图片段, 要切成何种几何形状的, 该切成多少片段?传统的方 法大都是切成正方形方块,切割数根据实际情况或模拟后作适当的处理。

五、MMORPG 动态负载机制实现

在上一片段中我们讨论了目前 MMORPG 所采用的负载平衡机制的架构, 这里我们将提 出我们的负载平衡方法,并且讨论如何动态以动态负载机制来调整线上游戏 Server 负载不 平衡的现象。

1、负载定义 多人在线游戏中 Server 端必须完成一下三个工作:

A.接受 Client 端玩家的状态、移动及交谈的讯息

B.处理玩家和 NPC(Server 控制的角色,如怪物,任务角色等)间的互动。

C.更新虚拟世界状态

D.将虚拟世界更新后的信息传送回 Client 端 以上工作当玩家越来越多的时候将话费更多的时间处理,因此 Server 上玩家暴增时, 可能无法将信息及时的传送给每一个玩家, 在这里我们把这四个工作所需要的时间定义成一 个 Server 的负载;很明显的,在一个 Multi-Server 的 MMORPG 系统中,每一个 Server 的负 载和它所负责的玩家个数成正比,因此,我们将每一个 Server 所负责的玩家的个数当成其 负载的重要指标。

2、负载平衡机制

在虚拟世界中,在非常多玩家的情况下,单一的 Server 必定会导致负载过重的现 象,因此 Multi-Server 的架构无疑是必须采用的解决方式,但是前面我们已经讨论了 Multi-Server 负载平衡机制的优缺点,其中较为有效的是动态的分配地图至服务器,下 面我们讨论如何实现这种机制。

首先我们必须解决如何切割游戏地图的问题, 以及切成多少等分, 因为这些将影响 到在此机制下实现整个系统的效率。

我们考虑的原则有一下几点:

1.尽量分散玩家到各个 Server 上。

2.尽量较少玩家间的跨 Server 的信息传送。

3.尽量避免玩家因为在地图上的位置移动而必须更换 Server。

其中第一点是为了平均分摊 Server 的负载,第二点是为了减少 Client 间通讯的时间成 本,第三点是为了减少 Server 间玩家资料的转移次数。

首先我们必须将地图切成跟 Server 个数相等的分数,使得每个 Server 至少有一份地图, 然而因为玩家会在地图上移动,因此若每个 Server 负责一份地图,那么时间一久,必会导 致负载开始不平衡。 另一种方式是将地图切成若干个小等分, 然后透过合理的方式将每个小 等分分散到各个 Server 上。当然,和上述情况一样,时间一久仍会产生负载不平衡,然而 这时候我们可以将负载太重的 Server 上的一部分地图片段再转移给其他负载较轻的 Server 上去,以达到负载平衡的目的。转移的时机是以 Server 的负载是否超过某一临界值,而转 移的对象是可采用 random polling 的方式,也就是询问相邻的 Server 负载情况如何,是否可 以接受额外的负载。

其次目前 Multi-Server MMORPG 大多采用将地图切割成正方形,然而应为正方形区域 共有东、西、南、北、东南、东北、西北、西南等八个相邻的区域,如此会正佳玩家因为移 动而转换区域的机会, 因此另有系统采用正六角形切割, 然而这种切割虽然相邻的区域减少 到六个,但是其切割方式较为复杂,并且判断玩家位于哪个区域也较为耗时。另一可行方式 是采用正三角形的切割, 此方式的优点是切割方法和判断位置区域的演算法均较正六角形简单。

但是以上切割方式都有一共同的缺点, 就是他们都为考虑到游戏地图的内容, 也就是说 不论地图的任何角落皆采用同样的切割方式,因此会很容易造成某个区域内没有任何的 NPC, 而另外一个区域内却包含数个 NPC, 而拥有 NPC 的区域通常是玩家驻足停留的地方, 因此包含数个 NPC 的区域意味这其高负载的可能性较高, 未包含任何 NPC 的区域意味着玩 家不会长时间停留,大多属于路过性质,因此玩家转换 Server 的可能性便会较高。 为了解决上述切割的缺点, 我们试图使用与地图内容相关的切割方式, 我们以每个 NPC 为中心来切割地图区域,是的每个区域仅含有一个 NPC,并且为避免玩家因暂时移动而跨 出区域,我们希望每个区域中的 NPC 和其他的 NPC 要有适当的距离。