`
KC008
  • 浏览: 27834 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

(转载)网游服务器通信架构的设计

阅读更多

转载自:http://www.cppblog.com/jack-wang/archive/2009/01/02/70963.html

 

随着网游从业者的规模和需求不断扩大,越来越多的朋友进入了网游开发这个领域,使得市场中网游开发技术相关的需求量迅猛增长。目前(网游)网络游戏行业比较紧缺的是具有较深技术功底的“专家型”开发者,这主要包括两个方面:服务器端设计人员以及客户端设计人员。对于网络游戏而言,由于其主要的游戏逻辑计算是在服务器端完成的,数据同步与广播信息的传递也是通过服务器完成的,所以,是否拥有一个有经验的服务器端设计人员已经成为一款网游产品能否成功的关键之一。鉴于此,本文将试图就网游服务器设计的一系列问题展开讨论和总结,笔者将结合自己的开发经验和体会,将其中各方面内容逐一呈现。希望能够对以下三类人员有所帮助:
  有一定网络编程基础、准备进入(网游)网络游戏行业作服务器端设计的人员;
  正在从事网游服务器设计的人员;
  网游项目的技术负责人。
  
  由于网游服务器的设计牵涉到太多内容,比如:网络通信方面、人工智能、数据库设计等等,所以本文将重点从网络通信方面的内容展开论述。谈到网络通信,就不能不涉及如下五个问题:
1、 常见的网游服务通信器架构概述
2、 网游服务器设计的基本原则
3、 网游服务器通信架构设计所需的基本技术
4、 网游服务器通信架构的测试
5、 网游服务器通信架构设计的常见问题

下面我们就从第一个问题说起:

常见的网游服务器通信架构概述
  目前,国内的网游市场中大体存在两种类型的网游游戏:MMORPG(如:魔兽世界)和休闲网游(如:QQ休闲游戏和联众游戏,而如泡泡堂一类的游戏与QQ休闲游戏有很多相同点,因此也归为此类)。由于二者在游戏风格上的截然不同,导致了他们在通信架构设计思路上的较大差别。下面笔者将分别描述这两种网游的通信架构。

1.MMORPG类网游的通信架构
  网游的通信架构,通常是根据几个方面来确定的:游戏的功能组成、游戏的预计上线人数以及游戏的可扩展性。
  目前比较通用的MMORPG游戏流程是这样的:

a. 玩家到游戏官方网站注册用户名和密码。
b. 注册完成后,玩家选择在某一个区激活游戏账号。
c. 玩家在游戏客户端中登录进入已经被激活的游戏分区,建立游戏角色进行游戏。

  通常,在这样的模式下,玩家的角色数据是不能跨区使用的,即:在A区建立的游戏角色在B区是无法使用的,各区之间的数据保持各自独立性。我们将这样独立的A区或B区称为一个独立的服务器组,一个独立的服务器组就是一个相对完整的游戏世界。而网游服务器的通信架构设计,则包括了基于服务器组之上的整个游戏世界的通信架构,以及在一个服务器组之内的服务器通信架构。

  我们先来看看单独的服务器组内部的通信是如何设计的。
  一个服务器组内的各服务器组成,要依据游戏功能进行划分。不同的游戏内容策划会对服务器的组成造成不同的影响。一般地,我们可以将一个组内的服务器简单地分成两类:场景相关的(如:行走、战斗等)以及场景不相关的(如:公会聊天、不受区域限制的贸易等)。为了保证游戏的流畅性,可以将这两类不同的功能分别交由不同的服务器去各自完成。另外,对于那些在服务器运行中进行的比较耗时的计算,一般也会将其单独提炼出来,交由单独的线程或单独的进程去完成。

  各个网游项目会根据游戏特点的不同,而灵活选择自己的服务器组成方案。经常可以见到的一种方案是:场景服务器、非场景服务器、服务器管理器、AI服务器以及数据库代理服务器。
  以上各服务器的主要功能是:

  场景服务器:它负责完成主要的游戏逻辑,这些逻辑包括:角色在游戏场景中的进入与退出、角色的行走与跑动、角色战斗(包括打怪)、任务的认领等。场景服务器设计的好坏是整个游戏世界服务器性能差异的主要体现,它的设计难度不仅仅在于通信模型方面,更主要的是整个服务器的体系架构和同步机制的设计。

  非场景服务器:它主要负责完成与游戏场景不相关的游戏逻辑,这些逻辑不依靠游戏的地图系统也能正常进行,比如公会聊天或世界聊天,之所以把它从场景服务器中独立出来,是为了节省场景服务器的CPU和带宽资源,让场景服务器能够尽可能快地处理那些对游戏流畅性影响较大的游戏逻辑。

  服务器管理器:为了实现众多的场景服务器之间以及场景服务器与非场景服务器之间的数据同步,我们必须建立一个统一的管理者,这个管理者就是服务器组中的服务器管理器。它的任务主要是在各服务器之间作数据同步,比如玩家上下线信息的同步。其最主要的功能还是完成场景切换时的数据同步。当玩家需要从一个场景A切换到另一个场景B时,服务器管理器负责将玩家的数据从场景A转移到场景B,并通过协议通知这两个场景数据同步的开始与结束。所以,为了实现这些内容繁杂的数据同步任务,服务器管理器通常会与所有的场景服务器和非场景服务器保持socket连接。

  AI(人工智能)服务器:由于怪物的人工智能计算非常消耗系统资源,所以我们把它独立成单独的服务器。AI服务器的主要作用是负责计算怪物的AI,并将计算结果返回给场景服务器,也就是说,AI服务器是单独为场景服务器服务的,它完成从场景服务器交过来的计算任务,并将计算结果返回给场景服务器。所以,从网络通信方面来说,AI服务器只与众多场景服务器保持socket连接。

  数据库代理服务器:在网游的数据库读写方面,通常有两种作法,一种是在应用服务器中直接加进数据库访问的代码进行数据库访问,还有一种方式是将数据库读写独立出来,单独作成数据库代理,由它统一进行数据库访问并返回访问结果。

  其中,非场景服务器在不同的游戏项目中可能会被设计成不同的功能,比如以组队、公会或全频道聊天为特色的游戏,很可能为了满足玩家的聊天需求而设立单独的聊天服务器;而如果是以物品贸易(如拍卖等)为特色的游戏,很可能为了满足拍卖的需求而单独设立拍卖服务器。到底是不是有必要将某一项游戏功能独立处理成一个服务器,要视该功能对游戏的主场景逻辑(指行走、战斗等玩家日常游戏行为)的影响程度而定。如果该功能对主场景逻辑的影响比较大,可能对主场景逻辑的运行造成比较严重的性能和效率损失,那么应考虑将其从主场景逻辑中剥离,但能否剥离还有另一个前提:此功能是否与游戏场景(即地图坐标系统)相关。如果此功能与场景相关又确实影响到了主场景逻辑的执行效率,则可能需要在场景服务器上设立专门的线程来处理而不是将它独立成一个单独的服务器。

  以上是一个服务器组内的各服务器组成情况介绍,那么,各服务器之间是如何通信的呢?它的基本通信构架有哪些呢?
  MMORPG的单组服务器架构通常可以分为两种:第一种是带网关的服务器架构;第二种是不带网关的服务器架构。两种方案各有利弊。

  就带网关的服务器架构而言,由于它对外只向玩家提供唯一的一个通信端口,所以在玩家一侧会有比较流畅的游戏体验,这通常也是那些超大规模无缝地图网游所采用的方案,但这种方案的缺点是服务器组内的通信架构设计相对复杂、调试不方便、网关的通信压力过大、对网关的通信模型设计要求较高等。第二种方案会同时向玩家开放多个游戏服务器端口,除了游戏场景服务器的通信端口外,同时还可能提供诸如聊天服务器等的通信端口。这种方案的主要缺点是在进行场景服务器的切换时,玩家客户端的表现中通常会有一个诸如场景调入的界面出现,影响了游戏的流畅感。基于这种方案的游戏在客户端的界面处理方面,比较典型的表现是:当要进行场景切换时,只能通过相应的“传送功能”传送到另外的场景去,或者需要进入新的场景时,客户端会有比较长时间的等待进入新场景的等待界面(Loading界面)。

  从技术角度而言,笔者更倾向于将独立的服务器组设计成带网关的模型,虽然这加大了服务器的设计难度,但却增强了游戏的流畅感和安全性,这种花费还是值得的。

分享到:
评论
1 楼 elan1986 2010-07-15  
谢谢了!

相关推荐

    网游服务器通信架构方案

    网游服务器通信架构方案, 详细讲述网络游戏的服务器架构方法。

    网络游戏服务器通信架构及关键技术研究

    很简单的入门实例,适合初学者。很好很nice

    网络棋牌游戏服务器架构.docx

    网络棋牌游戏服务器架构全文共7页,当前为第1页。系统首先启动中心服务器(CENTERSERVER), 中心服务器从INI文件中读取MainServer列表信息, 客户端提供全局配置,初始化数据,然后等待客户联结, 客户联结后CENTERSERVER...

    适用于网络游戏服务器无锁异步化事件驱动架构设计的 java netty 网络编程框架

    适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器。包体小、启动快、内存占用少、更加的节约、无需配置文件...

    棋牌类网络游戏服务端的架构设计

    网络游戏目前在国内相当热门,棋牌类游戏在网络游戏中占有比较...该文总结了一款通用的棋牌类网络游戏服务端的架构设计,介绍了基本架构、通信协议、多线程模型和第3方接I:1的相关内容,并对整个架构作了一定分析。

    JAVA泡泡堂网络游戏的设计与实现.rar

    系统设计稳定可靠,具备容错和异常处理机制,确保游戏服务器的稳定运行。 Java泡泡堂网络游戏通过精美的画面、丰富的玩法和稳定的网络连接,为玩家带来了一种刺激和欢乐的游戏体验,成为了网络游戏爱好者们的热门...

    2D网络游戏引擎的设计与实现

    游戏 引 擎 是一个处理游戏底层技术的平台,使用游戏引擎,游戏开发人员可以不用 ...本 文 研 究的课题初步探讨了2D网络游戏引擎的基本技术架构,对于国内基于2D的 网络游戏系统开发具有一定的借鉴和参考价值。

    基于C#的游戏服务器后台.zip

    基于C#开发游戏服务器后台涉及多个关键技术和设计决策。以下是一个概述,涵盖了从架构设计、性能优化到故障处理等方面的考虑: 架构设计 多线程/异步编程: C#提供了丰富的并发编程模型,如Task、async/await...

    Linux系统设计-linux系统下常见的socket通信包括客户端与内核和客户端与服务器

    它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业和服务提供商的首选操作系统,用于部署Web服务器、数据库服务器、邮件服务器等。Linux系统具有高效的网络功能和稳定的...

    JAVA网络通信系统的研究与开发.rar

    《Java网络通信系统的研究与开发》是指利用Java编程语言进行网络通信系统的设计、开发和实现的过程。以下是该过程的描述: 技术概述: Java网络通信系统是指利用Java语言及其相关技术实现的,用于在网络环境下进行...

    JAVA五子棋手机网络对战游戏的设计与实现.rar

    架构设计: 客户端:包括游戏界面显示、用户输入响应、网络通信等功能。 服务器:处理客户端请求、管理游戏状态、匹配玩家等。 数据库:存储玩家账号信息、游戏记录、排行榜等数据。 技术实现: 客户端:使用...

    Linux系统设计-Linux系统网络通信框架

    它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业和服务提供商的首选操作系统,用于部署Web服务器、数据库服务器、邮件服务器等。Linux系统具有高效的网络功能和稳定的...

    Java网上五子棋游戏设计(代码+设计文档)

    【作者】 傅伟,吴希忠 【来源】JavaThinker.org 本程序是一个基于网络协议为TCP/IP的网上对弈游戏,采用服务器-客户端的网络架构模式,允许网络上的多台机器(可能是两台机器)同时运行,一台用作服务器,始终处理...

    java服务器 java机器人 unity3D客户端.rar

    这是一款单服框架的游戏服务器架构。俗话说,麻雀虽小,五脏俱全,虽然是单服框架,但是也是包罗了很多游戏服务器开发必用的技术要点,方便部署和使用,可以说是从入门到高级的一个学习过程,也是通往分布式服务器...

    Linux系统设计-Linux C++ socket网络编程-即时通信系统

    它继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统,Linux是许多企业和服务提供商的首选操作系统,用于部署Web服务器、数据库服务器、邮件服务器等。Linux系统具有高效的网络功能和稳定的...

    JAVA五子棋手机网络对战游戏的设计与实现(源代码+论文).rar

    接着,我们设计了游戏的架构和模块划分,包括客户端界面、网络通信、棋局计算等部分。然后,我们分别实现了各个模块的功能,并进行了单元测试和集成测试,确保了游戏的正确性和稳定性。最后,我们对游戏进行了性能...

    CSharpGameFramework:基于unity3d引擎与c#语言的游戏框架架构(包括客户端与服务器)。使用ServerPlatform作为服务端通信基础设施

    一个极简的基于unity3d引擎与c#语言的游戏框架/架构(包括客户端与服务器)。本工程使用作为服务端基础通信设施。 受此启发,我在想是否也能够采用分层虚拟机的样式来实现游戏框架,框架部分就像内核,游戏特定逻辑...

    一款分布式的java游戏服务器框架,具备高性能、可伸缩、分布式、多线程等特点,java 8 +gradle 4.0

    适用于手游、h5游戏等各类高性能游戏服务器的开发 功能特点 基于Disruptor消息队列设计的无锁并发模式 分布式(多进程)架构,几行代码实现一个功能服务器的搭建 多线程设计,注解方式配置,轻松管理所有消息流 强大的...

    大型网页游戏架构书

    网络游戏中最重要的一个地方,这个关于通信的是影响到游戏是否能够顺利进行。 九.操作管理(ControlManager包): 用于设定游戏的操作键盘,和鼠标,实现与键盘鼠标进行交互管理用户输入的数据 十.游戏管理...

    基于Java的五子棋游戏的设计与实现.rar

    网络对战:如果需要实现网络对战功能,可以考虑使用Socket编程实现客户端与服务器之间的通信,并同步玩家的落子情况。 游戏记录:记录游戏过程和结果,以便玩家回顾对局历史。 音效与动画:为游戏添加音效和动画效果...

Global site tag (gtag.js) - Google Analytics