游戏服务器引擎设计

时间:2022-09-14 20:39:37

 

在写这东西之前,我有个事情要澄清一下:

本博客的目的,最重要的一点是记录某志学习的或喜欢的一些东西 以及 记录或发泄心情的日记 所用。后者大家都明白,前面的那个动机却给某志带来许多麻烦.

我要承认的是,在本博客中,极少资料是原创的. 不,应该说,没有资料是原创的.我现在处于学习技能的阶段,除了一些自己写的代码以外,我更多的是学习其他人的资料,总结了一下贴上来的,当然,一些非程序的资料更是直接转载来的.

可惜个人有个坏习惯,若转的帖子上没有标明"严禁转载"或"转载时必须表明作者,网站"该类信息提醒我一下的话,我实在没有兴趣去做额外的说明.但是这样不好,想了想,直接在博客标签上进行个全局说明好了,希望之后这种问题不会再麻烦我.

嘛,接下来说明正文.

一般来说,现在网络游戏的服务器设计大致分为以下三大类:

1:单服务器结构

2:多服务器结构. (根据服务器负责功能不同,有按地图范围进行划分的服务器设计,有按功能划分的服务器设计)

3:分布式服务器结构.

一:单服务器结构

在比较起先的MMORPG游戏中,大部分使用的是单服务器结构,一台服务器容纳人数大约为1500-2000人左右,根据硬件不同和游戏需要涉及的AI,逻辑等复杂度不同会有少许出入.

但是这种方式慢慢被淘汰了,因为网络游戏用户对游戏的品质要求越来越高,用户群也越来越大,开发者们不得不牺牲这种开发效率快,逻辑简单,但容载量小的单服务器结构.

二:多服务器结构

为了提高同服在线人数,多服务器结构慢慢流行起来,现在大部分游戏服务器结构也是基于该类结构设计的.

根据策划需求不同,多服务器结构可以设计为多种,一般来说,比较主流的功能分布方式有以下两中: 按地图划分服务器,按功能划分服务器.

按地图划分服务器,结构清晰,实现难度小,效率也相对比较高.但是会有部分资源的浪费(因为玩家不可能平均分布在每个地图上),另外一旦总控服务器(负责地图服务器间的分配管理的服务器)挂掉的话,会导致所有的地图服务器无法正常工作,而且由于每个地图保存一份数据,数据保存方面是相对独立的,所以数据安全性无法保障,一旦某地图服务器挂掉,则很大可能会遗失数据.

按地图划分服务器的话,一般服务器是分为以下三部分,世界服务器,地图服务器,网关服务器.

世界服务器负责世界地图的管理,它一般负责管理地图服务器的工作分配,数据转移通知功能,一些全局性的功能它也负责,包括读取发布网络游戏配置信息,全地图聊天公告的发布等.

地图服务器各自间是完全独立的,各自负责该地图区域内的一切功能,包括怪物AI,该地图的NPC,怪物,玩家,物品等所有信息,而且各自拥有独立的数据库进行记录.当一个玩家从一个地图切换到另一个地图时,地图数据库将通知世界数据库,世界数据库再通知另一个地图服务器,进行这俩地图服务器之间的用户数据传输.

网关数据库通常是负责玩家登陆的功能,同时也兼责一些世界服务器的调配功能.

//-----------------------------------------

按功能划分服务器的话,则是一种面象服务的设计思想,将游戏逻辑中某些常用密集型的功能分离开来,单独做为一个服务器进行控制操作,例如,怪物AI单独由一个服务器负责,物品管理单独由一个服务器负责等等,按照逻辑职能进行服务器分割.

这样做的好处是,当一个服务器出现问题的时候,是不会影响其他模块的运行,而且扩充性相对比较优秀简便.

但是一旦重要的服务器挂掉,如物品服务器挂掉,依旧是一个很灾难性的结果.不过,由于划分出了单独的服务器,保证了数据的分布式存放,比起场景划分服务器来说,多少还是安全了许多.另外,功能划分服务器还有一个比较大的问题就是,由于各模块之间有直接或间接联系,在服务器进行调试的时候难度会比较大.

三:分布式结构.

无特殊研究,待补充.仅知道支持远程对象调用,动态分布节点吞吐数据确保了服务器受压平衡,能够支持关键数据的多节点冗余确保了数据安全性.

服务器的设计考虑应从几个方面进行:

1:各服务器的吞吐数据平衡性

2:C-S-C的消息响应时间

3:数据的安全可靠性

4:开发测试效率,维护效率