p { margin-bottom: 0.08in; }
简单总结一下常见的 MMORPG游戏的服务端架构 .
从大的方面来说 ,主要有 LanucherServer,GateServer/ProxyServer,GameServer,DBServer等几个主要的部分 .
LauncherServer是整个游戏运营的过程中唯一的 ,它负责提供当前可用的服务器组列表,以及服务器相关的信息,比如在线人数,繁忙程度等等。 LauncherServer一般不负责和游戏相关的任何逻辑。
一般游戏更新的检查会放在 LauncherServer上,或者放在 Gate/Proxy Server上。或者独立的服务器提供游戏更新的下载。
GateServer是一个服务器组中用于协调客户端与服务器端的部分交互,以及协调服务器组内部的 GameServer之间负载均衡。(有的游戏用 MasterServer来做类似的服务器之间协调的工作)。
具体来说, GateServer的主要作用主要是这几个。
玩家登录验证,安全保护, GameServer之间的负载均衡,为 LauncherServer提供信息。
玩家的登录认证信息保存在 GateServer,玩家登录时从 GateServer进行验证, GateServer在验证成功以后给客户端一个认证的 Token,同时根据负载均衡的规则,决定将玩家分配到哪个 GameServer上。比如服务器简单根据场景来进行负载均衡,比如第 1-100个场景在 GameServer1上,第 101-200个场景在 GameServer2上,那么如果用户上次登录在第 102场景,那就会被分配到 GameServer2上。
这样,当 GateServer根据调度的结果,同时通知客户端( GameServer2的地址)和 GameServer2(有用户 xx将要登录这个服务器)。这样 Client就和 GameServer2进行交互。直到玩家要切换到 1-100的场景,那么 GameServer2会通知 GateServer告诉它 Client要离开 GameServer2,切换到场景比如 99。然后 GateServer得知这个消息后,重新调度服务器,然后重复上面的操作,将玩家切换到 GameServer1。
这个过程在玩家切换场景的 Loading过程完成,对于用户是透明的。
GameServer是服务器的核心,它处理所有的游戏逻辑以及游戏场景的服务器端计算,以及客户端逻辑的校验。一般来说,现在大部分有端 MMORPG游戏,在客户端都同时处理一部分游戏逻辑,所以服务器端和客户端相对来说,是对游戏的整个功能进行了划分。通常情况下,与图形显示相关的处理大部分在客户端进行,和图形相关的资源也多放在客户端,有的为了提高游戏运行效率,减少操作延迟,也将一部分逻辑放在客户端。服务器端一般主要是逻辑处理,和数据处理及存储等等。
上面的图上画的 GameServer在一个整体里面,但是实际的设计时,有的将不同的功能单独划分出来,比如有的服务器会将图形场景服务单独划分出来,作为单独的服务器。
它一般包括网络通信、并发处理、内存管理、游戏数据管理、游戏逻辑、脚本、图形场景服务等。
服务器端一般开启如下几个线程:
网络处理线程( N个,包括异步的消息发送和接受)、消息处理线程、服务器刷新线程、数据库线程、游戏主线程、场景服务线程等等。
GameServer运行时,首先读取服务器配置信息和游戏数据,与 GateServer进行通信获得服务器的调度配置信息,然后启动各种服务,比如消息处理服务、网络服务等等,启动完毕后注册到 Gate,开始提供服务。
具体的游戏设计的过程中,大部分的服务器端工作都是在 GameServer上完成的,这里面内容最多,先不详细描述,以后慢慢总结。
数据库设计上,一般会将用户登录数据单独拿出来作为一个独立的数据库,将与游戏相关的数据保存在另外一个数据库中。
相对于别的应用,游戏的数据库操作不算太多,一般将用户存档相关信息和全局数据保存在数据库中,临时数据一般保存在内存中,静态数据一般保存在数据文件中直接读取。
在游戏的部署过程中,一般部署 N个服务器组,每个服务器组是一个完整的游戏世界。根据网络等情况将服务器组部署在不同的机房,比如电信服务器北方 1、联通服务器南方 2等等。每个服务器组内部署 1台 GameServer,根据负载的情况,部署 N台 GameServer。数据库服务器一般在每个服务器组部署一台。
by lixinso 2011-02-26
http://blog.csdn.net/lixinso
Email: lixinso[at]gmail[dot]com