荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: mmkiller (庆祝上线2的10次方次), 信区: SoftDev
标  题: MMORPG开发入门zz
发信站: 荔园晨风BBS站 (2005年05月27日15:43:30 星期五), 站内信件

原著:Radu Privantu
翻译:pAnic
2005年5月11日

原文出处:A Beginner''s Guide to Creating a MMORPG


-------------------------------------------------------------------------------
-

译者序:这是一篇讲解如何开发一款MMORPG的入门文章,作者本人也是一款游戏的开发者
,文中的内容源于实践,有很高的参考价值。很多人都想拥有自己的游戏,这篇文章对那
些想自己开发游戏的人来说可能是一纸福音,也可能是一盆冷水。无论如何,开发游戏都
不是一件简单的事情。以下是翻译正文:


-------------------------------------------------------------------------------
-

  文章的中心是如何起步开发你自己的大型多人在线角色扮演游戏( 原文: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-bi
t颜色数太少(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亿公里以外的玩家交易(或者甚至在另一张地图上)
,记录下来。如果一个玩家试图查看,或者使用一个遥远的地图对象,记录它。小心假的I
D。例如,正常情况下每个玩家都会分配一个ID(ID在登陆的时候分配,可以是持久的(唯一
ID)。 如果ID在玩家登陆的时候赋予9或怪物被创建的时候),显然可以用玩家数组(保存玩
家)的位置(索引)作为ID。
  所以第一个登陆的玩家ID是0,第二个是1,依此类推。现在,通常你会有一个限制,
比如说2000个索引在玩家列表里。所以如果一个客户端发送一条命令类似:“查看ID20000
0的角色”,这会使服务器当机,如果没有防备的话,因为服务器会访问非法的内存区域。
所以,一定要检查,就像这样: "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 联系。


--

 正在专注与我的第N次游戏开发. 目标: Online RPG.
 开发环境: Visual C++ 7.0, DirectX 8.
 当前进度: 客户端图形、IO引擎。
 进度Blog: http://blog.csdn.net/garfield
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 210.21.224.235]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店