文章的中心是如何起步开发你自己的 大型多人在线角色扮演游戏( 原文:Massive Multiplayer Online Role Playing Games) (MMORPG)(译者注:俗称:网络游戏,网游)。 针对的读者是经验和资源有限的开发者。 读完文章之后,你应该懂得如何起步, 还有一些关于什么是应该做的和不应该做的忠告。第一步是评估你的能力和资源。你必须对自己诚实,因为做你力不从心的事情会浪费你的时间并让你心灰意冷。

第一步:评估你的能力必须的技能:

  • 懂至少一种编程语言。 迄今为止, C++因为性能和效率的优越性成为游戏开发者的首选。 Visual Basic, Java 或者 C# 可能也是不错的选择。
  • 熟悉一种图形库。通常的选择是SDL, OpenGL, 或者DX/D3D。(译者注:网上也有很多免费/付费引擎下载和出售)
  • 选择一种网络通讯库。 你可以从WinSock, SDL_net, 或DirectPlay中选择。(译者注:很多人喜欢开发自己独特的网络库,这并不复杂,似乎ACE也是一种选择)
  • 对游戏开发有大体的经验。 例如,事件循环, 多线程, GUI 设计,等等。

强烈推荐的技能:

  • C/S结构通讯。
  • 多平台开发。 你可能希望设计一个MMORPG, 尤其是服务器能运行在多种操作系统。为此,我推荐使用SDL, OpenGL 和SDL_net。
  • 网站开发。如果你想让用户通过网站查看玩家统计,服务器信息和其他信息,这是必须的。(译者注:其实网站可以交给其他人开发,如果有必要的话)。
  • 安全管理。 你当然不想因为有人攻击你的服务器而浪费时间!
  • 团队组织能力。 你需要一个你能成功领导和管理的团队。

第二步:初步规划我注意到很多人在不同的论坛发帖子寻找团队开发MMORPG。他们中的大部分是这样:“我们成立了一个公司/游戏工作室,需要3个美工,两个程序,1个音乐制作,等等。为了创新,不要参考过去的MMORPG,你有全部的自由用来创造你想要的世界,等等。 我们会在项目完成并赚到钱的时候付给你酬劳,等等”。 不幸的是,以现有的技术和带宽,你无法拥有一个动态的世界。 朝向无法到达的目标前进只会导致失败。正确的做法是拿出一些小规模的,功能性强的,可扩展的设计和构架。
基本软件构架首先,尝试创建一个简单的C/S模型,有如下功能:

  • 创建一个新角色
  • 保存那个角色(服务器端)
  • 用那个角色登陆
  • 能够和其他人交谈
  • 能在3D空间游览

保存角色看起来简单,其实不然。 例如,有两种方式保存角色:使用数据库服务或者使用文件。两者有各自的优缺点:

  数据库 文件
优点
  • 添加新域或者修改现有的都很简单。
  • 更新玩家统计数据非常简单(从游戏外)。
  • 你可以通过SQL查询方便的获取不同种类的统计结果。
  • 无需自行完成I/O操作,数据库会替你做好。
  • 易于更新/恢复。
  • 高速操作(读/写)。
  • 实现简单。
  • 无需额外的库。
  • 不依赖数据库服务器。因此你不必担心数据库升级或安全问题。
缺点
  • 容易出错。 例如,做一个更新查询的时候遗漏了'where'子句。会导致惨痛的损失,尤其是你没有备份的时候。
  • 数据库会比打开/写入一个玩家档案文件慢。你查询一些数据的时候会耗费几个毫秒,尤其是大量玩家同时登入/登出的时候。
  • 需要额外的代码进行游戏和数据库间的数据转换。
  • 需要操作数据库和SQL的经验。并且需要一个程序和数据库之间的接口库。
  • 如果因为某些原因数据库文件损坏,那算你倒霉,你可能会丢失所有的玩家数据(尤其是短期内没有备份的时候)。
  • 很难添加新的域,除非一开始就很小心的设计了文件的格式/结构。
  • 没法做全体玩家的查询。(这可以通过每天晚上用程序把重要字段添加进一个数据库间接实现)。
  • 如果你想更新/检查玩家状态,你必须额外写代码。
  • 更新和还原比较复杂。

现在你决定了如何存储角色,你还得选择C/S通讯的网络协议:TCP 还是 UDP?,我们都知道TCP速度慢,但是更准确,并且需要额外带宽。我实际使用TCP并没有遇到什么问题。 如果你有充足的带宽,TCP是个好选择,至少对初学者是这样。  UDP 会很麻烦,尤其是对新手。 记住,游戏或引擎的初步测试会在你的局域网进行,所有的包都会按顺序依次抵达。在Internet上无法保证这一点。虽然包会按顺序到达,但是有时候会丢包,这通常是个麻烦事。 当然,你可以设计你的协议使得C/S能够从丢包中恢复。但这对初学者来说很痛苦,不值得推荐。 
第三步:选择数据传输协议又是看起来很简单,其实不然。你不能只是发送'/0'结尾的串。因为你需要一个通用的协议,能同时适用字符串和二进制数据。用0(或其他字符)做结束符是不明智的,因为那个结束符可能是你要发送的数据的一部分。此外,如果你发送20字节,然后再20字节,服务器极有可能收不到两个20字节的包。取而代之的是,它会一次性收到40字节,这是为了避免浪费带宽在不必要的头上。 而且,你可以发送1KB的包,但服务器会以两个小包的形式收到它。所以你必须知道哪里是一个包的开始,哪里是结束。在 “永恒大陆”(译者注:原文: Eternal Lands,本文的作者正在开发的一款MMORPG)中,我们用如下的方法:

  • Offset 0: 1 字节 表示传输的命令。
  • Offset 1: 2 字节,传输的数据长度。
  • Offset 3: 变长,消息内容。

这种方法有一致的优点:所有的数据传输有统一的标准。缺点是有些命令有固定已知的长度,浪费了一些带宽。以后我们会改成混合的方法。
下一件事是决定服务器模型: “非阻塞soket,不使用线程”,或者“阻塞soket,使用线程”。两种方法(使用线程 vs 不使用线程)各有优缺点。
线程:

  • 服务器响应会更加平滑,因为如果一个玩家需要大量时间(例如从数据库中读取数据),这会在它自己的线程中完成,不会影响其他人。(译者注:也许作者的意思是每个玩家都有独立的线程,但这对MMORPG不太现实)
  • 难以恰当的实现和调试:你可能需要大量同步,并且一个小疏忽就会导致灾难性的后果( 服务器瘫痪,物品复制,等等)。
  • 可以利用多处理器。

无线程:

  • 实现和调试更简单。
  • 响应速度慢。

在我的公司,我们使用无线程的方法,因为我没有足够的资源和人力处理线程模式。
第四步:客户端你打算做2D还是3D游戏?有些人认为2D游戏做起来简单。我两者都做过,并且我倾向于3D游戏更简单。容我解释。
2D下,你通常有一个帧缓冲,也就是一个巨大的象素点数组。象素点的格式会因显卡的不同而不同。 有些是RGB模式,另一些是BGR模式,等等。每种颜色的bit数也会不同。只有在16bpp模式才有这个问题。8-bit和24-bit模式简单一些,但有他们各自的问题(8-bit颜色数太少(256),而24-bit速度更慢)。同时,你需要制作你的精灵动画程序,不得不自己排序所有对象,以便他们以正确的顺序绘制。 当然,你可以用OpenGL或者D3D制作2D游戏,但通常这并不值得。并不是所有人都有3D加速卡,所以使用3D库开发2D游戏一般会带给你两者的缺点:不是所有人都能玩,你也不能旋转摄像机,拥有漂亮的阴影,和3D游戏炫目的效果。(译者注,目前绝大部分显卡都支持565的16bpp格式,这个也成为目前16位色的业界通用格式,有不少文章和代码都是讲述这一格式下图像处理的,尤其是使用MMX技术) 
3D的途径,正如我所说,更简单。但是需要一些数学(尤其是三角)的知识。现代的图形库很强大,免费提供了基本的操作(你不需要从后到前排列对象,改变物体的色彩和/或帖图都十分简单,对象的光照会按照光源和它的位置计算(只要你为它们计算了法向量),还有更多)。并且。3D给了你的创作和运动更多的自由度,缺点就是不是所有人都能玩你的游戏(没有3D卡的人数可能会让你大吃一惊的),并且,预渲染的图片总是比实时渲染的更漂亮。(译者注:市面上想买不支持3D的显卡目前很困难,只是高性能的3D卡价格也不低)
第五步:安全显然,不能相信用户。任何时候都不能假设用户无法破解你精巧的加密算法(如果你使用了的话)或者协议,用户发送的任何信息都要通过验证。极有可能,在你的服务器上,你有固定的缓冲区。例如,通常有一个小(可能是4k)缓冲区用来接收数据(从soket)。恶意用户会发送超长数据。如果不检查,这会导致缓冲区溢出,引起服务器瘫痪,或者更坏的,这个用户可以hack你的服务器,执行非法代码。每个单独的消息都必须检查:缓冲区是否溢出,数据是否合法(例如用户发送“进入那扇门”,即使门在地图的另一端,或者“使用治疗药水”尽管用户没有那种药水,等等)。 我再次强调,验证所有数据非常重要。一旦有非法数据,把它和用户名,IP,时间和日期,和非法的原因记录下来。偶尔检查一下那个记录。如果你发现少量的非法数据,并且来自于大量用户,这通常是客户端的bug或者网络问题。然而,如果你发现从一个用户或者IP发现大量非法数据,这是明显的迹象表明有人正在欺骗服务器,试图hack服务器,或者运行宏/脚本。同时,决不要在客户端存储数据。客户端应该从服务器接收数据。换句话说,不能发送这样的消息“OK,这是我得物品列表”或者“我的力量是10,魔法是200,生命值是2000/2000”。 而且,客户端不应收到它不需要的数据。例如:客户端不应该知道其他玩家的位置,除非他们在附近。 这是常识,给每个人发送所有玩家会占用大量带宽,并且有些玩家会破解客户端从中获取不公平的利益(像在地图上显示特定玩家的位置)(译者注:就像传奇的免蜡烛外挂)。所有这些似乎都是常识,但,再次,你会惊奇的发现有多少人不知道这些我们认为的常识。 
另一个要考虑的问题,当涉及到安全:玩家走动的速度必须在服务器计算,而不是客户端。(译者注:这是重要的原则,但是会耗费大量服务器资源。魔兽世界没有这样做,它采用类似其他玩家揭发的形式掩盖这个事实,导致加速外挂可以用,但是在有其他玩家的时候会暴露)。服务器应该跟踪时间(以ms为单位)当客户最后一次移动的时候,并且,移动的请求如果比通常的极限更快到来,这个请求应该被抛弃。不要记录这类虚假请求,因为这可能是因为网络延迟(也就是玩家延迟,过去的10秒内发送的数据同时到达了)。
检查距离。如果一个玩家试图和100亿公里以外的玩家交易(或者甚至在另一张地图上),记录下来。如果一个玩家试图查看,或者使用一个遥远的地图对象,记录它。小心假的ID。例如,正常情况下每个玩家都会分配一个ID(ID在登陆的时候分配,可以是持久的(唯一ID)。 如果ID在玩家登陆的时候赋予9或怪物被创建的时候),显然可以用玩家数组(保存玩家)的位置(索引)作为ID。
所以第一个登陆的玩家ID是0,第二个是1,依此类推。现在,通常你会有一个限制,比如说2000个索引在玩家列表里。所以如果一个客户端发送一条命令类似:“查看ID200000的角色”,这会使服务器当机,如果没有防备的话,因为服务器会访问非法的内存区域。所以,一定要检查,就像这样: "if actor id<0 or if actor id> max players 然后记录非法操作并且断开玩家。如果你使用C或者C++,注意或者定义索引为'unsigned int' 并且检查上限,或因为某些原因定义为int(int,默认是有符号的),记得检查 <0 and >max 。没有做这些会严重挫伤你和其他用户。类似的,要检查超出地图坐标。如果你的服务器有某种寻路算法,并且客户端通过点击地面来移动,确保他们不要点击在地图外部。 
第六步:获得一个团队制作游戏需要大量的工作(除非是个Pong and Tetris游戏)。尤其是MMORPG。你无法单靠自己。理论上,一个完整的团队组成是这样:

  • 至少3 个程序员: 1 个做服务器,两个客户端(或者一个客户端,一个负责工具,例如美术插件,世界编辑器,等等)。有6个程序员是最好的,更多就没必要了。这取决于你的领导能力。最少一个美工,2到3个更合适。如果这是个3D游戏,你需要一个3D美工,一个2D美工(制作帖图,界面,等等),一个动画师,和一个美术部负责人。美术部应该由有经验的人组织和安排,除非你就是个艺术家。,
  • 少数世界构建者:创建所有地图是个漫长的过程, 并且直接关系到游戏的成败。再次,你需要一个世界构建部的负责人。你的世界需要协调一致,所以不能只有一个意气用事的人。
  • 一个 网站管理员是必须的,除非你精通网站设计,并且愿意花时间做网站。音效和音乐不是必须的,但是有音效和音乐的游戏比没有的会更吸引人。
  • 一个游戏经济系统 设计师.。你也许觉得那很简单,可以自己来做,但事实上那是最复杂的工作之一。如果经济系统设计不良(比如物品没有平衡,资源在地图上随意放置,等等。)玩家会觉得无聊并且退出游戏。我们早期的进展存在很大的问题,尤其是因为经济系统主要是由我(一个程序员)设计的,它没有被恰当的计划。 于是,我们花费了两个月来重新思考和建立一整个新的经济系统。这需要一次完全的物品清除。我告诉你,玩家会很不乐意你删除他们的物品。幸运的是,大部分玩家赞同这个想法,但是这么多小时的争论,妥协,解释和时间的浪费还是让我们丧气。以后会更多。

如前所说,你需要一个10~15人的团队,不包括协调员和管理者。这10~15人必须是有经验的。如果都是新手就不值得,因为你需要花大量时间解释要做什么,怎样做,为什么他现在的做法不好,等等。
一开始就凑齐10~15人几乎是不可能的。不管你在不同的论坛发多少帖,你也无法找到合适的团队成员。毕竟,如果一个人在他/她的领域得心应手,为什么在你无法拿出任何东西的时候他/她要加入你的团队?很多人有远大的想法,但是实现它们需要大量时间和努力,所以他们宁可从事自己的工作也不会加入你。那如果你需要10~15人,但是无法让他们加入你的团队,你如何才能制作一款MMORPG呢? 好,事实上,你一开始不需要所有人都到位。你真正需要的是一个程序员和一个美工。如果你是个程序员,只要找个美工就可以了。请求懂美术的朋友帮忙,花钱请大学生/朋友做一些美术或者其他工作。
现在你有了一个美工,你期待的游戏的样子,现在可以开始实现了。一旦你有了可以运行的C/S引擎,一些用来展示的截图(或者更好,玩家可以登陆你的世界,四处走动,聊天),更多的人会愿意加入你的团队。更恰当的是,除非你使用独有的技术,否则你的客户端可以开源。许多程序员会加入(作为志愿者)一个开源工程而不是非开源项目。而服务器不应该开源(除非你打算做一款完全开源的MMORPG)。
其他一些忠告:在有东西可展示之前,不要夸大你的游戏。最惹人烦的事情之一就是一个新手发一个“需要帮助”的请求,并且解释这个游戏到底有多酷,最后要求一个巨大的团队加入他的游戏制作。一旦你拥有了网站广告(通常是在一个免费主机),你会看到一个吸引人的导航条,包含“下载”,“截图”,“ 原画”(译者注,原文:Concept art,概念艺术,在游戏应该指美工的原始设计),“论坛”。你点击下载链接,然后看到美妙的“建设中”页面(或者更糟糕,一个404错误)。然后你点击截图,得到同样的结果。如果你没有东西给人下载,就不要放下载链接。如果没有截图展示,不要放截图链接。然而更好的是,在工程进展10%(程序和美工)之前,不要浪费时间在网站上。 
第七步:打破某些神话

  • 你无法制作MMORPG, 只有大公司才可以。
    我不同意。虽然制作一款像魔兽世界(World of Warcraft),无尽任务2(Ever Quest 2),亚瑟王的召唤2(Asheron's Call 2),血统2(Lineage 2),和其他一些游戏对一个小型的自发团队是不可能的,但是做一款像样的游戏还是可以的,只要你有经验,动机,和时间。,你需要1000小时的编程来制作一个可运行的测试版,大概10~15k小时完成几乎完整的客户端和服务器。但是作为团队领导者,你不能只编程。保持团队团结,解决争执,维护公共关系(PR),技术支持,架设服务器,惩罚捣乱分子,自由讨论,等等都是你的职责。你可能会被非编程的任务淹没。你很可能需要上班/上学,这减少了你花费在项目上的时间。我们很幸运,没有成员离开团队,但是如果这种事情发生,那的确是大问题。假设你的美工半途离开。或者更糟糕,他/她没有给你使用他/她作品的许可。当然这可以通过和他们签订合同来解决,但找另外一个美工仍然很麻烦。一个工程中有两种不同的美术风格也是问题。
  • 需要大笔金钱(通常 4-6 位数) 用来架设一个 MMORPG 服务器.
    当然,这不是真的。我见过专业服务器,1000GB/月,不到100美元/月(2~300美元的初装费)。除非你的数据传输协议设计非常不合理,1000GB/月对一个1000玩家在线(平均)的服务器来说足够了。当然,你还需要另一个服务器做网站和客户端下载(客户端下载会占用大量流量,当游戏变得流行的时候)。我们的客户端有22MB,有时候会有400GB/月的传输量。而我们还没有很流行(仍然)。另一件事,我们不需要另一台专用服务器开启这个工程。ADSL/cable服务器可以胜任,直到你的同时在线人数达到20~30。然后要么找一个友好的主机公司,用广告交换免费主机,要么就只能自己掏腰包了。
  • 制作一个MMORPG很有趣。
    这不是真的。你可能认为每个人都会赏识你,玩家会支持你,你标新立异,并且,当然,很多玩家都玩你的游戏。玩家可能让人讨厌。即使是完全免费的游戏,他们也能找到理由抱怨。更糟糕的是人们经常会抱怨矛盾的事。战士会抱怨升级太难,商人会对战士掠夺大量钱财很失望。如果你减少怪物掉落物品,有些玩家就会威胁说要退出游戏。如果你增加,同样的一群人会不满新手能更简单赚钱的事实。 真是左右为难。改革和改进是必须的。如果你决定改变某些东西,例如给加工物品增加挑战性,有些人会说太难了。如果你不做,他们又会说太简单无味。你会发现满意的玩家通常不会说什么并且感到满意,同时破坏者会怨声载道。

MMORPG的经济比单机版难以平衡的多。在单机游戏,你可以逐渐改良武器,只要玩家进展,他/她可以使用更好的装备,丢弃(或者卖掉)旧的。另一方面,在多人游戏里,这种观点不成立,因为每个人都试图得到最好的武器,而跳过低等级武器。大部分玩家宁可空手省钱,直到他们能买游戏中最好的武器。经济系统设计要参考相关的文章。
迄今为止我列举的所有事情,加上额外的工作和挑战,足以让你在决定涉足这个工程之前三思而行。你必须知道你的决定意味着什么。
总结希望这篇文章能给你足够的知识。我的下一篇文章将介绍如何建立一个经济系统(更明确的,要避免哪些错误),还有一些调试服务器和客户端的信息。
关于作者这篇文章作者是 Radu Privantu, 永恒大陆(Eternal Lands) www.eternal-lands.com的主程序和项目规划, 永恒大陆是一款免费,客户端开源的MMORPG。作者可以通过 chaos_rift at yahoo dot com 联系。

MMORPG开发入门相关推荐

  1. Hololens Unity 开发入门 之 Hello HoloLens

    Hololens Unity 开发入门 之 Hello HoloLens~ 本文主要记录 HoloLens Unity 开发入门 ~ 一.说在前面的话 Unity 对 VR AR 甚至 将来的 MR ...

  2. 【Arduino】开发入门教程【一】什么是Arduino

    Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...

  3. unity开发入门_Unity游戏开发终极入门指南

    unity开发入门 Unity is a great tool for prototyping everything from games, to interactive visualisations ...

  4. 《iOS 8应用开发入门经典(第6版)》——第1章,第1.6节小结

    本节书摘来自异步社区<iOS 8应用开发入门经典(第6版)>一书中的第1章,第1.6节小结,作者 [美]John Ray(约翰 雷),更多章节内容可以访问云栖社区"异步社区&qu ...

  5. openresty 前端开发入门五之Mysql篇

    2019独角兽企业重金招聘Python工程师标准>>> openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysq ...

  6. Android项目驱动式开发教程 第2版,《Android项目驱动式开发教程》第一章开发入门.ppt...

    <Android项目驱动式开发教程>第一章开发入门 1.4 项目框架分析 4 android:versionName="1.0" > 5 8 第9行代码andro ...

  7. 《SAP FIORI 开发入门》课程答疑 第二期

    课程上线已经一个星期,本人也接到了同学们提出的一些问题.在这里把典型的问题的回答重新整理一下,帮助后来的同学. 再次放上课程的连接: SAP FIORI开发入门 希望老师能够再放开一章免费的课程. 已 ...

  8. JSP WEB开发入门基础到高手进阶教程002

    JSP WEB开发入门基础到高手进阶教程 -------开发入门 JSP与微软的Active Server Pages 兼容,但它是使用类似HTML的卷标以及Java程序代码段而不是VBScript. ...

  9. 5G 时代的 Android App 开发入门与项目实战

    随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...

  10. 《Android应用开发入门经典(第3版)》——第6.1节创建演示应用

    本节书摘来自异步社区<Android应用开发入门经典(第3版)>一书中的第6章,第6.1节创建演示应用,作者 [美]Carmen Delessio , Lauren Darcey , Sh ...

最新文章

  1. java thread 无法执行_哪位大神帮我讲一下这段代码,为什么线程不能继续执行
  2. iextensionunit类_Java ICompilationUnit.reconcile方法代码示例
  3. 又一个可视化神器Highcharts,Python版也有哦!
  4. PostgreSQL 9.4版本的物化视图更新
  5. cocos2d-x初探学习笔记(20)--物理引擎box2d(2)
  6. [JavaWeb-JavaScript]JavaScript注释数据类型
  7. MySQL · 案例分析 · RDS MySQL线上实例insert慢常见原因分析
  8. Python网页抓取
  9. Struts2学习笔记(十六) 文件上传(File Upload)
  10. 鳗鱼刺多怎么处理图像_图像二值化处理
  11. python 日期操作【转】
  12. DeepLab图像分割
  13. 量子计算机编程教程,量子信息与量子计算简明教程 PDF扫描版[12MB]
  14. 三妈式初音miku_【MMD模型】三妈式初音 Appearance Miku 原版
  15. css让div背景变成半透明
  16. 姓氏头像制作生成头像组合微信小程序源码
  17. ffmpeg 码率控制(总结篇)
  18. nginx反向代理服务器
  19. MySQL插入数据库乱码问题Incorrect string value: ‘\xE8\xB5\xB5‘ for column ‘name‘ at row 1
  20. CSS统计数据记录数量

热门文章

  1. 电子产品销售数据分析及RFM用户价值分析
  2. 周灏:金融大数据量化信用
  3. chrome安装crx文件
  4. js创建节点删除节点实例
  5. 利用Tween让动画更平滑(补间动画)
  6. JAVA复制数组的三种方法
  7. oracle18c静默安装教程,Oracle 18c 19c 安装的 DBT-50000 错误解决
  8. macd java_macdev/java.md at master · pubyun/macdev · GitHub
  9. 基于SpringBoot+ Vue 音乐平台
  10. ultravnc,4款不能错过的ultravnc汉化版