一个高性能MMORPG网络游戏的架构实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、服务器组模型的选型
考虑到近年来计算机硬件技术的飞速发展,物理服务器的性价比得到了很大的提高,结合项目需要通过服务器组给数万玩家提供高质量服务的商业要求,经过研究对比数种服务器模型后,决定采取了上图所示的服务器组模型。
二、MMORPG服务器系统架构
MMORPG大型网游服务器是使用高性能网络I/O模型配合消息队列连接各服务线程的一个非常稳定的高性能网游系统。其中消息队列系基于共享内存自行开发完成。在单服务器标准工作环境下进行测试,一台双 XEON 服务器可以非常轻松地达到为4,500用户每秒处理5,000请求,每秒处理请求数可超过225,000。
三、MMORPG的实现
首先,在基础建设方面,与规划现实中的城市一样,得先搭建起一系列的房屋、道路及出口、管线和诸多NPC人物等构成的基本要素和活动空间,通过在服务器端(Server side)取得预先设计好的综合地理、NPC人物、技能等一系列的初始化数字数据(具体文档片段请见附件A.地图数据文件示例和附件B.司机 NPC 数据文件示例),然后依靠程序将数字数据和游戏逻辑有机地协调起来,最终形成一套完整的虚拟游戏基础空间。
在确定了地图数据生成规则后,就可以使用编辑器任意编辑游戏场景。依赖于这样良好的基础设施,才能在其他游戏逻辑的配合下实现完整的故事情节。同时服务器端负责将属于用户各自的游戏逻辑数据通过验证后发送到合法的用户客户端机器里,完成客户端游戏逻辑的建立和数据同步。担负服务器与客户端通讯的是自定义格式的数据通讯封包,它就像数字神经般贯穿着整个游戏的始终。数据封包与如下4部分消息有关,它们分别为场景消息, 同步消息,主角消息和界面消息。
A.主角消息包括客户端所控制的角色的所有动作,包括走路,聊天、交易、战斗等。
B.场景消息包括昼夜兴替、气候变化,一定的时间在场景里出现某些东西等,这类消息具有的特点是所有消息的发起者都是服务器,广播对象则是场景里的所有玩家。
C.同步消息是针对发起对象是某个玩家,经过服务器广播给所有看得见他的玩家,该消息也包括所有的动作,该种消息是服务器广播给客户端的,主角消息则一般是客户端主动发给服务器端。
D.界面消息是服务器发给客户端的聊天消息和各种属性及状态变化的信息。
值得一谈的还有处于网络游戏中比较重要的服务器同客户端消息广播和同步问题。其中一种方法是采取在国际上被称为 Mutual synchronization(相互同步),是一种对未来网络的前景的良好预测出来的解决方案来解决确保每个玩家在各自客户端上看到的东西大体是一样的同步问题。
首先客户端需要在登录游戏的时候建立很多张广播列表,这些列表
在客户端后台和服务器端要保持不定时同步。其中要建立多张列表,是因为要广播的类型包括全局信息、本地信息和远程信息等等,这些列表都是在客户端登陆的时候根据服务器发过来的消息建立好的。在建立列表的同时,还需要获得每个列表中广播对象的传输时间,并且要维护一张完整的用户状态列表在后台,也是进行不定时的和服务器进行同步,根据本地的用户状态表,可以使一部分决策由客户端来决定,当客户端发送这部分决策的时候,则直接将最终决策发送到各个广播列表里面的客户端,并对其时间进行校对,以保证每个客户端在收到的消息的时间是和本地时间进行校对过的,再采用预测补偿计算提前量的方法,计算出提前量,根据计算量确定实际行走速度,将会使同步变得非常的平滑。
其中,广播的重点就在于如何计算出广播的对象,首先在服务器端的连接结构里面增加一个广播对象的队列,该队列在客户端登陆服务器的时候由服务器传输给合法的客户端,然后由客户端自己来维护这个队列,当有人走出客户端视野的时候,由客户端主动要求服务器给那个对象发送消失的消息。
当有人走进视野的情况,则先需要客户端在每次给服务器发送更新位置的消息的时候,服务器都给该连接算出一个视野范围,然后在需要广播的时候,循环整张地图上的玩家,找到坐标在其视野范围内的玩家从而完成广播的全过程。
其次是虚拟对象系统。其中主要会涉及到NPC的概念,尤其是广泛应用的A Star算法等在提供NPC的人工智能决策方面有着重要的作用。NPC智能使用一种是被动触发事件和是主动触发事件的方式由计算机来实现对NPC做何种决策。A Star算法就是典型的启发式搜索的应用,其普通原理是先设计一个Rule() 函数,来获这一个点的代价,然后每次搜索的时候把下一步可能到达的所有点都经过Rule() 函数评价一下,获取两到三个代价比较小的点,继续搜索,直至得到代价最小的一个点。最明显的应用是NPC在实现自动选择攻击目标和逃跑时的实现。实现自动选择攻击目标时,首先获得地图上距离该NPC附近的敌人列表,设计相应Rule() 函数,根据敌人的强弱、远近,判断出几个评估数据,然后选择代价最小的敌人进行主动攻击。逃跑则是在主动事件里面检查自己的HP,如果HP低于某个值,而敌人正近战攻击的时候,则触发逃跑函数,在逃跑函数里面也是对周围的所有的敌人组织成列表,然后设计Rule() 函数,先分析选择出对你构成威胁最大的敌人,该函数还需要判
断敌人的运动速度,战斗力强弱,最后得出一个主要敌人,然后针对该主要敌人进行路径的Rule() 的函数的设计,搜索的范围只可能是和主要敌人相反的方向,然后再根据该几个方向上的敌人的强弱来计算代价,做出最后的选择,如果幸运的话,可以有80%的机率逃往没有 NPC 阻挡的邻近地图中去。
最后,由于脚本是RPG游戏的灵魂,自然脚本编译器就扮演了十分重要的地位。在基于编译的服务器端程序中,是无法在程序的运行过程中构建一些东西的,所以必须通过脚本编译器提供一些简单的语法和文法解析的功能,进行一系列的逻辑判断和循环,以提高服务器端的灵活程度。可使用类似汇编语言的那种结构来实现脚本编译器,设置一些条件跳转和循环来实现逻辑判断和循环。提供一些通用指令,如判断、循环、四则运算、寻址等等,针对不同的脚本采用不同的解析方法,对NPC就用NPC固定的脚本,对Item就用Item固定的脚本,解析完以后就把结果生成底层该对象的结构便于使用。
经过以上的建设步骤,一个完整的MMORPG网络游戏系统就被逐步建立起来了。