zoukankan      html  css  js  c++  java
  • (转)MMOGS服务器架构设计

    一,介绍

             1.1背景和目的

           MMOG是MassiveMultiplayer Online Game的缩写,以前也叫MMORPG,就是Massive Multiplayer Online Role Playing Game,即大型多人在线角色扮演游戏。现在还有很多公司使用这个名字。这是一种成千上万人同时在线玩的游戏。玩家可以在这个游戏里面待很长时间。在线游戏是一个充满各种挑战的美妙世界,同样,它也给开发者带来了挑战。

             这篇文章就是以研究MMOGs体系构架为目的。我已经研究了一些市场上已存在的游戏设计,并找了一个在线游戏为例子进行分析,这个游戏叫International FootballManager game,即IFM游戏,为了更深入的了解MMOG中图形动画是如何展示的,我使用了IFM游戏的一个新特性,来突出显示一场足球比赛。

             这篇文章将讨论MMOGs的设计技术,并说明了与其它非MMOGS游戏的不同之处,以及讨论了如何根据玩家的不同来设计。在分析IMF游戏的过程中,一个相同主的MMOGS构架将被提出,并对这两种构架做了对照。

             关于MMOGS的网络方面,将在client/server编程中作为主要部分介绍。像带宽限制,刷新频率,可以向网络中发送的最大数据量,它们在MMOGS设计中是很重要的一部分。

             关于MMOGS的安全性也是非常重要的,在文章的后面也会涉及到。根据目前的世界环境,黑客绝对是以计算机为基础的行业的噩梦。所以要保证安全性,给MMOGS开发者带来了很大的压力。因此MMOGS的困难之处也会说明,并给出了一个有效的解决方案。

             用来存储和维护MMOGS的数据的数据库系统将在一个独立的章节中介绍。将给出一个重要的数据结构,因为它可以减少存储所消耗的时间。

             在后面的章节中,也给出了根据市场调查而得出的分析结果,它是很重要的一部分,比如开发MMOGS的花费,游戏开发应该考虑哪些策略等。

             纵观MMOGs的历史,第一款角色扮演的游戏只是图像的简单显示。这并不是游戏开发者们不想把游戏做的丰富多彩,而是由于受当时的带宽限制。随着计算机的价格越来越低,处理能力越来越强,复杂的图形图像游戏才得以发展起来。MMOGS游戏才得以自成一派。

             就算回到当时最流行的电玩的时代,吸人玩家的不过也是游戏中漂亮的图像。即使是游戏中的一个小角色,图片越漂亮吸引的玩完就越多。

             在现在的游戏中,没有动画也是可以的。就像IFM,它只是一个管理类的游戏,由数值和统计表组成。在我上大学的时候,就已经会在实时类游戏中使用计算机图像,通过对它的学习,也让我大概知道了为什么图形图像对于MMOGS是那么的重要。现在的玩家都喜欢美丽的动画环境,因此越来越多的图形图像被应用在许多玩家参与的游戏之中。比如IFM这款游戏已经做到了,它基本实现了一个未来图形图像的特点,来展现一场非常不错的足球比赛。并且也实现了物理的人工智能,这一点将在后面的文章中介绍。

            另外,对一些3d编程工具做了一些介绍和对比,如果将来有些开发者想做自己的MMOGs游戏,可以参考。

    2.1 创建和设计MMOGS


    在创建和设计一款MMOGS的时候,必须在开发前期做好阶段性的设计和知道要达到什么样的目标。这章主要讲述怎么样来设计游戏和达到一个什么样的目标,同时,IFM将被做为一个对比的例子在本章中使用。IFM在MMOGS中可以被定义为在运动策略和多人在线角色扮演的游戏。在IFM中包含了多个游戏世界。在一个游戏世界中,包含了200多个国家,每个国家的国家队有四个分区,每个分区有12个球队,一共9600个球队,这是一个游戏世界的最大容量。如果有必要,你也可以创建一个新的世界。如果用户过多,一个解决方案是为每一个国家增加一个分区。

    2.2 鼓励玩家合作


    近几年来,创建一个社区已经是一个成功的MMOGS设计开发的主要目标。鼓励玩家合作的主要因素有以下三个:

    (1)合作可以减少系统负载。假如一个服务器最多可以容纳3000人同时在线,每个人可以单独攻打一个怪物 ,那么      服务器必须能够支持3000个同时并发攻击。同时还包括AI,碰撞检测等等。而如果三个人同时攻击一个怪时,      服务器只需要支持一千个并发就可以了。

     (2)合作可以增加游戏的多样性,这样长时间的玩家就不会感觉到无聊。玩家在游戏世界里面待的时间越长,赚的      钱才越多另外值得注意的是一些玩家可能会把他们的朋友或亲人带到游戏中去,这更有益于游戏的收入。

     (3)人们玩MMOGS游戏一般会建立自己的社会关系,这有可能会扩展到游戏之外。甚至有些玩家退出了同MMOGS游戏,他们还会在游戏之外保持他们的友谊。

    不幸的是,在IFM中没有怪物可被杀死。所以,IFM游戏的体系不得不面对另外一种类型的方案。这个方案就是关注模拟足球比赛,它需要尽可能快的计算。它涉及到游戏世界中每一场比赛所需要的计算。在目前世界中有多少正在玩的球员,独立计算大约需要15分钟。

    就前面提到的第二和第三因素来说,玩家经常在游戏外面建立社会关系。在应用市场上每一款成功的游戏都有几种聊天系统。在开发的前期,IFM的开发人员就已经有了创建聊天室的想法。在聊天室里面,玩家可以联系,交流一些游戏经验。但是,IFM开发了一种略微不同的聊天室,这种聊天室是模拟的酒吧形式。在一个私聊的聊天室内,有一个桌子,最多可以坐十个人,它们之间可以相互聊天,每个人提出的问题将显示在屏幕上,有一个3D的符号表示他们自己。增加的这个功能是非常有用的,最终的结果是越来越多的人玩IFM,这也意味着为玩家创建一个愉快的气氛可以带来更多的收益。

    在现在的IFM游戏中,一个玩家只能管理某一个球队。在未来的计划中,可以让20到30个玩家同时管理一个球队,每个玩家在球队中可以选择一个具体的角色。这些角色可能是教练,助理,市场代表,财务管理者等。这样会让促使玩家更多的交流。游戏这方面的改进将实现上面说到的第三种情况。

    2.3 创建适合大众的MMOGS


    设计MMOGS游戏有一些具体的挑战。因为现实中存在着不同类型的玩家,在设计MMOGS游戏时,应该记住极端不同的两类玩家:

    (1)一般玩家,这些人一般不熟练或者没有玩游戏的经验。

    (2)骨灰级玩家,他们有丰富的游戏经验和知识。

    对一般的人来说,游戏玩起来必须愉快且有趣。实际上,为了创建一个让人有兴趣的游戏,冲突是必须的。要让玩家感觉冲突有意义且重要是一个很大的挑战。因为骨灰级玩家有很高的实践等级,因此玩游戏时的激情并不是他们的主要追求。从一开始困难等级就应该具有挑战性。骨灰级玩家先入为主的思维与普通玩家也是不一样的。如果在开始的时候,对一般玩家隐藏游戏的复杂性和降低困难等级,它们将支持需要长时间玩的游戏设计。

    大众化游戏的设计哲学是不要让游戏的构架影响玩家愉快的玩游戏。下面是一些有用的开发大众化游戏的通用规则:

    (1)让玩家立刻感觉很刺激

    (2)避免让玩家做一些无知的选择。

    (3)游戏应该决定地理

    (4)玩家会话尽里短

    (5)允许和鼓励玩家学习策略

    (6)团队合作将比个人成功获得更多的奖励。

    重要的是在游戏设计时一定要记住玩家是谁,不要忘记之前的设计准则。IFM游戏就是为那些有管理游戏经验的人开发的。因此这些有经验的人进入游戏就知道他们期待的是什么,但是,也希望有新的玩家来玩。这个游戏有丰富的在线文档和用户手册,所以新的玩家也可以去玩。所以任何人都可以很快管理这个游戏,当然,只有长时间去玩,才会知道如何使用一些策略。

    在IFM游戏中,那些充满热情的玩家会得到一些奖励的。自从IFM游戏有了它自己的报纸,每一个玩家都可以写关于游戏的文章,这些文章可能会刊登在他们的报纸上。每一篇文章将被管理员审查,

    只有最好的一个可以刊登。如果一个玩家的文章被刊登在了报纸上,它将会得到一个积分。在季度结束的时候,积分最高的前三名玩家可以免费玩下一个季度。

    3 MMOGS服务器网络开发


    3.1 网络介绍

          在网络中,多台计算机之间可以使用同一种标准网络协议相互通信。网络通信协议包括:TCP / IP(Transmission Control Protocal/Internet Protocol),UDP(User Datagram Protocol),一种网络协议定义一种通信数据格式,这样,不同的计算机即使使用不能的操作系统,只要连接了互联网就可以相互通信。

    3.2 TCP 与 DCP不的同

       TCP是一种可靠的传输协议,它通过检测数据包,并保证传输的数据包的正确性。在网络中,一种危险的情况是丢数据包的现象,即它不一定能从发送端到达服务器端。而TCP支持数据包重发机制,如果一个数据包没有成功到达接收方,它会自动重新发送一个。一直循环下去,直到数据包到达或者超时。当数据在客户端发送的速度太快时,TCP/IP会激活流控制机制,降低数据的传输量。值得注意的是,有些服务器不得不这样做。

       UDP协议是一个非常小的传输协议。换句话说,它只提供最低的传输服务。这种协议主要被用在那些不需要TCP流控制机制的应用上。UPD是一种不可靠的传输协议,它不保证数据包一定会从发送方到达接收方,也不必需要 一个连接。另一方面,在传输中出现的错误必须由应用程序负责处理。UDP协议通常被用在实时交互中。

          在不同的计算机之间,IP控制数据的移动目的。它提供了一些额外的错误报告。因此,IP在数据的传输过程中是非常重要的,这取决于其它的通信协议,比如,TCP发送的数据会按照正确的发送顺序返回,而且TCP和UDP必须连接到IP协议上。

    3.3  Clien / Server 编程

      服务器的任务就是等待客户端的连接,服务器与客户端的架构和功能是不一样的。这一章将讨论这个问题。

      如果没有客户端的连接,服务器将什么都不足。有一点需要记住的是,服务器是有时候是被动的。如果没有客户端连接,让服务器空循环是一种浪费CPU的行为。服务器的各类有两种,一种是迭代服务器,一种是并发服务器。它们两个最大的不同是,迭代服务器同一个时间只能连接一个客户端,因此,它基础上是没什么用的。而并发服务器可以用适当的方式保持多个客户端的连接。当它启动之后,第一件事情就是运行主线程监听客户端的请求连接。目前,线程已经取代了创建一个子进程来监听客户端。

    示图3.1显示了并发服务器是如何工作的。根据应用程序的状态,它可以成功接收所有客户端的请求。直到达到此服务器的最大连接上限。使用socket来监听是非常重要的。一个Socekt连接就是一个数据流通过的管道。

      在计算机中存在两种不同的socket,一种是定向的流Socket,它在通信之前,必须先建立好连接。经过TCP的三次握手。另外一种是数据报Socket,它是一种无连接模式,无论什么时候发送任何数据,都是先发往一个预定的地址。也就是说,数据报socket的传输对用户来说是透明的。如果一方主机断线,另一方主机是无法察觉到的。对于开发者来说,一定要注意这一点,这也是流socket与数据报socket的不同之处。流socket用的是TCP/IP技术,而数据报Socket用的是UDP技术。

    3.4  Client/Server 操作


    3.4.1 一个简单传输协议

      对于开发者来说,TCP是一种简单的传输协议,对于服务器来说也是一样的。服务器要做的事情就是等待并接收来自客户端的连接。连接成功之后,在服务器与客户端之间才能交换数据。最后,假如客户端请求关闭连接,服务器会验证关闭请求。下面是一个时间序列图:

      
       

    3.4.2 无连接协议

      前面讲到,TCP服务器必须等待连接,而如果是UDP服务器,就不必等待连接,因为UDP是一种无连接协议。当数据被传输过来的时候,UDP只去读取数据内容就可以了。它不维持连接,它的行为依赖于数据的内容,以及开发者想要让它做什么。一个客户主机可以仅仅发送一个有特殊意义的数据包给服务器。这种模式叫做“主动通知”,在通信开始的时候先发送一个通信,服务器接收到这个消息后开始更新客户端列表,或者仅仅是根据设计创建一个子进程。但是当有许多的客户端同时连接服务器时,可能导致服务器负载过重,造成信息延迟现象。这也是为什么子进程技术被优先考虑的原因。对于UDP服务器来说,一个服务器只需要一个socket与客户端交互。为了能传输信息,主机必须知道对方的地址信息,包括IP和端口。

    3.5 服务器端开发

      这一章主要讨论MMOGS服务器开发中的基本问题。服务器开发是非常重要的,所以在开发前期一定要仔细调研,做好构架设计。在游戏的开发过程中,有很多的选择,规定和潜在的解决方案,不同的解决方案将产生不同的结果。

    3.5.1  无缝服务器

       MMOGS服务器同时可能要管理成千上万个玩家。因此,MMOGS服务器都是基于分布式部署的。多台服务器可能共享游戏之间的数据。通常使用的一个方法就是把一个游戏世界按场景分成不同的大区,让他们被不同的服务器程序管理。游戏世界可以划分两种类型,无缝的或分块的。这两种类型的不同这处在于,服务器的边界在游戏中是否可以直接看到的。一种说法是,无缝游戏世界中的玩家并不知道游戏世界中的物体是被多个服务器管理的。游戏世界中的部分块在地理上依赖于区域(场景),不同的区域之间没有明显的冲突和不协调。这样交互的玩家就会感觉到是在同一台服务器上。决定是实现无缝世界还是分块世界,这对游戏开发的每一部分都影响很大,因此它是非常重要的。

    3.5.2 服务器的负载均衡

      把一个游戏服务器侵害成多个小的部分,这样做的好处是可以更好的实现游戏平衡,它可以同时在不同的服务器上处理不同的游戏内容。这样子做也更容易添加新的游戏内容而不影响正在运行的游戏。均衡服务器的负载有很多种解决方案。其中一种常的方案是根据游戏的地理场景边界进行拆分游戏世界,把不同的地理场景放到不同的服务器上。

          有没有其实的解决方案呢?在游戏设计中可以获得哪些解决方案呢?答案是这依赖于游戏本身的设计,而且游戏中的玩家数量一直在讨论之中。以下可能作为一些解决方法:

         (1)分开物理计算和游戏逻辑计算

      (2)独立运行AI(Artificial Intelligence)

      (3)花钱提高硬件能力

    3.5.3 分开物理计算和游戏逻辑计算

      现在流行的MMOGS基本上都是3D的,控制一个3D世界要花费大量的时间更新物体的移动,运行碰撞检测,以及更新其它相互联系的物体活动。一个可能的方案是让更新物体的位置和碰撞检测分别运行在别的服务器上,与处理游戏逻辑的服务器分开,正如下面所示,使用物理计算服务器(Physics Server)处理物体的移动,使用游戏服务器(Game Server)处理游戏逻辑。前端服务器(Front End Server)根据数据包的不同类型,负责转化数据包到物理计算服务器,还是游戏逻辑服务器。

    3.5.4 独立运行AI

      另外一部分是服务器的AI负责,可以让AI单独在一台服务器上运行。需要注意的是,这样子做会有一些负面影响。首先就是数据的复制,因为AI的行为通常决定于其它的一些游戏主体,比如玩家的信息。

       假如有这样一个场景,一个主体A的行为决定于另外一个主体B的位置,假于这个主体B因为网络阻塞等原因没有及时更新,那么主体A的AI处理将不能被同步。这个时候,同步操作就会被执行,同时增加了服务器间的交互量。假如数据复制不能被很好的管理,很明显数据就会出现不同步的现象,这将会导致反常的行为出现,而且这种BUG很难被发现。

    3.5.5 提高硬件性能

       最后一个方法就是提高单个服务器的处理能力。这样子成本就上升很多。比如使用多核多线程处理器。使用多核处理器就相当于提高了CPU的处理能力,增加了CPU的吞吐量。

    3.5.6 无缝世界的好处

       一个游戏上线之后,随着时间的推移,用户将越来越多。无缝世界可以适应这种动态的增长。服务器的界限和两种类型:一种是动态的,一种是静态的。动态的服务器界限可以在运行时自动适应服务器增加的负载。而服务器的静态界限只在能服务器停止时通过调整,才能平衡增加的负载。

       无缝世界的另外一个好处是它潜在的高稳定性。如果突然有服务器宕机或程序崩溃,其它服务器可以自动调整分担剩余的负载。而且无缝世界会把地图化分为很多小的图块,仅仅当前端需要的时候才载加,这样子可以大大减少地图加载的时间。

    3.6 移动预测

    这一节主要讨论一下在MMOGS游戏里,客户端主体运动的位置预测问题。这是一个广泛而重要的问题。在MMOGS游戏中,玩家对控制人物角色的运动知觉性将影响玩家在游戏中的体验 。比如,玩家控制的人物角色不能穿过关闭的门或静止的箱子。这些问题在一些的网络游戏中都会出现,不仅仅是MMOGS游戏中。

    客户端这边的运动预测基于两点考虑,首先,对玩家执行的操作不但要立刻返回结果,而且要考虑到网络延迟。很明显,当玩家执行一个动作时,需要等待一会它自己执行,这是无法忍受的。在大多数情况下,对于玩家每一个操作,客户端不需要等待服务器计算完返回之后再执行。

    在大多数的MMOGS游戏中,客户端会按一个固定的频率和服务器进行场景同步,一般是每秒同步4到20次。如果使用TCP来发送数据,那么这个延迟是不可预料的。在数据传输的过程中,可能会出现丢包现象,这个时候,TCP会重发数据包,如果丢失的数据包带有物体的位置信息,在位置更新的时间差中,很容易造成位置无法预料的变化现象。

    下面介绍一些处理网络延迟的技术:

    (1)    命令时间同步

    (2)    推测

    (3)    可逆模拟

    3.6.1 命令时间同步

      在一些MMOGS游戏中,一些物体根据请求路径,将被移动到一个明确的位置上,这个时候,使用命令时间同步方法是非常适合的。这些一般是一些实时性的MMOGS游戏,当一个客户端A想要把一个物体移动到一个具体的位置时,这个请求首先发送到服务器,由于网络的延迟,当其它客户端接收到这个消息时,客户端A的物体已经移动了一段距离了。对于其它接收A请求的客户端来说,为了补偿这一小段距离,物体必须在服务器的延迟的基础上立刻移动到它最终的位置。从服务器向各个客户端发送“把物体O移动到位置P”的信息时,根据客户端离服务器的平均距离,在同一场景中,每个客户端的结果是不一样的。

    针对上述的问题,一个好的解决方案是,服务器向客户端发送“把物体O在未来的时间T内,移动到位置P“,假设在不同的主机之间,时间是同步的,而且物体的移动速度可以用某种方法计算出来,这样在每个客户端的场景中,物体就能在正确的时间内到达它最终的位置上。

    例如:

    对于客户端A,它的速度是v,要达到位置P,它们之间的距离是S,那么在客户端A中,到达位置P的时间T = S / V.客户端A向服务器发送命令的时间T1,其它客户端接收到物体移动的命令时间是T2,那么网络延迟的时间就是(T2 – T1),其它客户端场景中的物体必须在T – (T2 – T1)的时间内移动到物体最终的位置上。

    3.6.2 推断

    在下面的图中显示了一条直线和一条曲线。直线代表的是客户端已知道的物体运动的路线,而曲线代表的是服务器上物体实际运动的路线。

                                 

    图上的每一个圆点代表一个时间单位。如果在一个预定的范围内,客户端不能接收到物体的更新信息。位置推断技术将被使用。方法很简单,客户端等待服务器发送更新位置消息的时间越长,客户端的物体与服务器端的物体位置偏离越远,最后似乎成了两个物体了。

    一种使用推断的技术叫“航位推测法“。”航位推测法“是客户端的一种预测形式。它被广泛的应用于那些分布位置数据的MMOGS中,也是一种网络延迟补偿方法。”航位推测法“就是根据物体现在的位置,方向和速度,预测物体下个位置的方法。为了便于理解,假设某一时刻,一个物体在客户端A移动了,但是位置的更新信息还没有被服务器广播到其它客户端。“航位推测技术”将估计物体的新位置,这主要是基于这个物体现在的位置和速度,上一个位置的加速度有时候也是估算物体新位置的重要因素。

    “航位推测法”的使用,需要MMOGS的设计者和开发者共同研究,从众多的技术中做出最好的选择。例如,在位置的更新信息没有到达之前,模拟时间是否被用于“航位推测技术”,将对物体的移动结果产生不同的影响,最后的结果可以清晰的被看到。

    如果模拟时间没有被使用,将会出现什么结果呢?由于网延迟的原因,物体的更新位置可能是过去的。在过去的时间里,物体已经到达一个估算的位置上。当更新的实际位置到来时,将会出现物体突然从猜测的位置跳到实际的位置上。如下图所示,可以清楚的看到这个现象:

          

    所谓的模拟时间,就是在新的位置更新信息没有达到之前,客户端根据物体的位置,方向,速度,运行的时间。分清楚更新时间和模拟时间的不同,就可以避免如上图的现象。如下图,当位置的更新消息到来时,物体不是立刻回到实际的更新位置上,而是从模拟时间内到达的位置,根据物体的运动速度和方向,平滑的移动。

    另一方面,最终采取哪种推测技术更合适,这取决于MMOG的类型。在有些游戏中,真实的物体运动路径是绝对重要的,这个时间更新时间和模拟时间就不是优先选择的了。

    3.6.3 可逆模拟

    这种技术主要被用于射击类的MMOGs中。比如,客户端射击一个它看到的目标。由于网络的延迟,射击命令将延迟到达服务器,当射击后,客户端看到的目标在服务器上可能已经到达另外一个位置上了,这将会发生什么情况呢?尽管客户端能看到目标,但是子弹却打不着。如下图:

    利用可逆模拟技术可以解决这个问题。方法是,服务器追溯到这个物体最后接收命令的时刻,即子弹射出时的位置,就好像这个物体没有移动过一样。这时服务器再开始计算事件的结果。如下图:

    服务器会按正确的顺序接收客户端的命令。如上图,当射击的时候,物体被放到正确的位置上。然后服务器开始验证,并消除目标。

  • 相关阅读:
    String与StringBuffer
    oracleSQL文
    中国IT成功人士特点6大成功密码全解析
    对java学习有帮助
    Spring之工厂模式
    搭建IBatis 框架
    单例模式(Singleton)
    UVa 10180 Rope Crisis in Ropeland!
    HDU 3711 Binary Number
    UVaLive 4643 / LA 4643 Twenty Questions(对题意的解释已修改)
  • 原文地址:https://www.cnblogs.com/mosquito-woo/p/4402811.html
Copyright © 2011-2022 走看看