2004年暑期之前,我有幸得到了传奇3的源代码,经过本人大半年的工作,该代码已经全部调试通过,但由于本人的精力有限,不能最大发挥该代码的能量,故决定转让该代码, 全部代码包括2个客户端程序代码,7个服务端程序代码,以及地图编辑器、图片编辑器、脚本编辑器、数据转换器等工具的代码。
这是一个完整的大型2D网络游戏的代码。
为使对此代码感兴趣的人有一个了解,本人对该代码及调试的过程作一个大概的介绍。
一、服务器采用机群式架构:
服务器由数量不定的Gate服务器、Game服务器、DB服务器组成,除Gate服务器需要公用IP外,其它的服务器都可以在内网上运行。这样的设计,可以适应硬件的变化,也可以适应用户的变化。Login服务器可以自动选择游戏服务器,以平衡游戏服务器的负载,而某个游戏服务器只在某个或某些地图上提供服务,Gate服务器除了转发数据包、加解密外,还可以过滤数据包,对客户端进行身份确认等。将Gate服务器分出来,还可以保护其它服务器。
具体方案可以参考本人附送的“Mir of Legend” Servers Architecture文档
二、客户端有一个完整的2D图形引擎(函数库),(即使不懂DirectX)利用该引擎,可以方便地将文字以及图片(瓦片、什物、角色、魔法)以各种效果贴到屏幕。
三、完整的地图系统,在地图文件中不仅记录了瓦片,也记录了各种事件、光照、动画等。
本人的主要工作:
1、弄清了整个服务器的体系结构,画出了Servers Architecture图,对数据的流向有清楚的认识。
2、用IO完成端口服实现了服务器间的通讯,提高了服务器的性能,而原来的代码中没能实现。
3、解决并完善了多线程的共享问题,而原来的代码没有解决这个问题。
4、在发行版本的程序中嵌入了自诊断代码,使得在Release 版的程序中的错误也能被发现。
5、更改了原来的怪物AI的算法,使得怪物的行动效率更高,现在的怪物数量已达8万个,反应时间更短,在P4 3。0G 1GRAM的机子上运行,装入所有地图(500个),怪物数量达8万个时,CPU的使用率只有60%。
6、更改了原来的脚本解释器算法,使刷钱,刷装备外挂无缝可钻。且结构更简单更清晰,不懂程序的玩家也能自己编写脚本。
7、服务器端增加了防盗技术,所有程序都不保存在硬盘上,而是运行时临时加密上传到服务器中,保留在内存中,即使有人进入了服务器,也看不到程序,更无法复制程序。程序所用的关键数据也是临时加密上传,即使有人得到了程序,也由于得不到关键数据,而无法正常运行。
8、加入了反私服技术,由于利益的驱使,服务器端程序也无法保证不流出。反私服技术就是在上面第七点失去作用的情况下的最后一个有效的招术,即在服务器端程序中留下后门,只要一条指令,就可使服务器不定期的死机,重启,耗尽资源等。
9、地图编辑器、图片编辑器、脚本编辑器、数据转换器等工具的制作都是本人的工作。
经验及体会:
1、关于该代码的来源:
该代码除工具的代码没有泄漏外,其它的代码均泄漏出来了。似乎是内部人员所为,但从代码中看并不是这样简单,从代码的编写风格来看,至少有3个小组参与了编写,客户端1个,服务器端至少有2个,客户端与服务器端的接口以及服务器端程序之间的接口都不一致,甚至连加密解密这样的函数也有错误,在服务器端的2个小组中,一个是完全C++的代码,另一个残留有DEPHI的代码,并且有大量的韩文注释,由此可以看出,该代码的泄漏是在程序的合成期,既不在内测期,也不在公测期。从私服的服务器端程序来看,服务器端有用C++写的程序,也有用DEPHI写的程序,而该套代码全部是用C++写的,这说明该套代码有可能是一套废弃的代码。
2、作坊式的游戏软件公司也可以取得成功:
国内有传媒指责韩国的游戏公司大多是作坊式的游戏软件公司,所出的游戏也是二流游戏,奥美德公司及其出品的传奇游戏也在其内。其实不必这样指责别人,只要市场认可就行,每每以技术的观点看待一款游戏显得过于幼稚。
如果有了完整的源代码基础, 游戏的制作门坎就更低:
一两个核心程序员+源代码+投资人=一款游戏
对于网络游戏,核心程序是服务器端程序,投资人只要投资客户端的图片制作和广告费用。这可是最大程度上的代码复用。
3、软件工程大有可为,但目前作用有限:
没有接触过大型软件的程序员对软件工程意义的理解是十分有限的,通常只能停留在书本上。我想,完全按照软件工程原理制作的软件是不多的,至少在国内是如此。
贯彻软件工程原理和方法的程度依赖于系统分析员个人的经验,并受限于实际条件。
例如:针对一个具体的问题,选择何种开发的语言,如何将问题分解到每一个小组,在小组中如何将任务再分配,一但某个小组在某个算法上遇到了困难,如何采取有效的办法去解决,如何协调各个小组的工作等等,这些在教科书上都有说明,但实际操作时却完全依靠个人的经验和能力。不同的系统分析员在同样的问题上发挥的作用是大不相同的。
例如:能否在详细设计之前就知道该软件的性能瓶颈,数据流量的瓶颈,从而在开发中给予足够的人力、财力和时间。
由于系统分析员的精力所限,不可能精通所有算法,甚至不可能知道都有哪些算法,如果他面临一个从未接触过的问题,有些算法知道而有些不知道,那么他将如何面对这些不知道的算法呢?例如:如何让计算机识别出一幅图片中是否有一个苹果,并且不会把一个西红柿也当成苹果呢。如何让一个计算机五子棋程序具有自主学习的功能呢。
所以,尽管有软件工程作指导,但一个软件能否开发成功,能否在市场上取得成功,在很大程度上是个未知数。
从传奇3的代码来看,它不象是在软件工程严格管理之下的产品。例如,它有很多类的成员变量没有初始化。
4、如何保证代码的安全:
以本人的理解,代码安全也是软件工程学中研究的问题,而且代码安全问题存在于软件开发各个阶段。但翻了几本教科书,也没有看到代码安全的论述。
从目前来看,大型软件的开发文档比源程序更具有价值。那么开发文档是向所有参与项目的人员开放,还是只开放相关的部分,如果只开放相关的部分,那么这些编写代码的程序员是否对自己的部分有足够的信心呢,那么这些只有极少数人能看到的开发文档是否科学合理呢。
从传奇3的程序看,里面的代码全部是可编译的C++代码,依本人的看法,这样有不合理之处,要保证代码安全,代码只能对极少数核心程序员开放,而一但核心程序员离开,代码安全将不保。本人以为,2D图形引擎、加解密模块、通讯模块、角色引擎可以作成DLL文件,这些由一个小组完成,并在程序中留下后门。然后将这些DLL文件分发到其它各个小组中去。在同样的条件下,普通程序员可以更专心于算法的设计,并且可以适当扩大代码的开放度,有利于提高软件的质量。各个小组可沿接口的两边同时开展工作并且进行测试,这样做即使在代码的合成期各个小组也不必看到对方的代码。各个小组的负责人只对本小组的代码安全负责,同时发生代码泄漏的情况将不复存在。
经常有报道说某某游戏的源代码泄漏了,大部分是炒作,只有极少是真正的泄漏。服务器要有防黑客技术,服务器端程序在设计时也要考虑这个问题。黑客防不胜防,内测时使用DEBUG版的程序带源码调试,外测时就不能使用源码调试,因此自诊断技术就必不少,必要时还要把服务器端设计成GATE+SERVER双机式的结构。其中GATE在外网上运行,SERVER在内网上运行。
5、防盗和反私服技术并不难,但传奇3为何不吸取传奇2的教训:
本人以为这是沿用了微软的套路。
6、网络游戏的收费方式将成为今后软件收费方式中的一种重要方式:
在网络大行其道的未来,多数应用软件都将设计成客户端+服务器端式的结构。用户每次使用软件就必需与服务器相连,并取得服务器的认证,服务器根据用户所使用的功能、使用的时间进行收费。这并不是说所有的功能在服务器上实现,用户使用的只是终端。一种可能的方式是用户在使用时才下载必要的模块,这个模块可以很小,但很关键,这个模块甚至可能仅仅是一些数据而已,而且是进行过加密的。这种按时,按功能收费的方式似乎更合情合理。
7、C++模板库和通用类库使VC程序开发变得更快捷方便,成本更低:
传奇3游戏是使用C++模板库和通用类库的典范。
其它的象如何开发面向不同人群的不同版本的软件,如何自动升级软件等等,本人也都作了一些思考,在此就不多说了。
传奇3源代码研究总结【实用】
最新推荐文章于 2024-07-07 14:56:39 发布