一个老程序员的心得

  不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差的太远。世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。
   1. 扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。(广州达内,中国高端IT培训专家。 www. tarena.com.cn/guangzhou不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。
   2. 丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。
   3. 最简单的是最好的。这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。(IT培训咨询QQ:787031304;)简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
   4. 不钻牛角尖。当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
   5. 对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。
   6. 多与别人交流。(达内科技IT培训,先就业,后付款!)三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。
   7. 良好的编程风格。注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。
   8. 韧性和毅力。这也许是"高手"和一般程序员最大的区别。A good programming is 99% sweat and 1% coffee。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。

揭秘:《剑网3》开发全过程

转载自http://job.17173.com/content/2008-11-20/20081120172521681,1.shtml

作者:西山居工作室/剑网3/程序 Readme

  
编者按:西山居作为国内知名的游戏工作室,十余年来积累和沉淀了很多东西,无论是美术还是策划或程序或测试,无论是早期的《中关村启示录》、还是现在的《剑侠情缘》系列。金山官方博客将会邀请西山居美术、策划等同事为我们分享游戏制作过程中的点点滴滴。希望通过这些,能够让大家更多地了解到游戏是如何“炼”成的,也希望通过此,为有志于游戏行业的朋友们提供一些指导和建议。

  剑侠情缘叁为什么要自己开发引擎?

  剑侠情缘叁是西山居的第一款全3D网络游戏,使用的是我们自主开发的剑侠叁3D引擎。也许有人会好奇的问:市面上有这么多的游戏引擎,为什么不选择成熟的引擎而要选择自主研发呢?你们真的有信心能做的出来?这个问题就需要从金山的传统说起了。金山是一个以技术立业的公司,我们的核心竞争力在于自主研发能力。从WPS到毒霸再到剑侠情缘网络版,都是从无到有,自主研发出来的。全3D网络游戏代表着网络游戏的发展趋势,而其中的核心技术之一就是3D图像引擎。3D图像引擎技术的理论基础是计算机图形学,这是一门成熟的学科;而在开发剑叁3D引擎之前,我们使用过一款商业化的引擎,在技术上有了一定的积累。有了理论的指导和实际的经验,我们对自主开发并完成一款3D引擎有相当的信心。我们也希望通过引擎的开发建立一支稳定高效的团队。在剑叁引擎的开发过程中,我们的团队始终保持着对技术的不懈追求,不断的完善着3D引擎的功能和效果。同时通过和美术策划同事的合作,我们在引擎相关工具的制作上也积累了大量的经验。这些收获为我们今后追求更高的目标打下了坚实的基础。

  我们做了什么?

  从立项到现在,剑侠情缘叁经过了多年的开发。在这漫长的过程中,我们都做了些什么呢?我们主要的工作包括3D图像引擎和相关的工具的开发。

  图像引擎的作用,是把抽象的数据转换成图像显示到屏幕上。剑叁采用的是由多张地图组合成为整个游戏世界的方式。我们把每张地图都称为一个场景,玩家的人物就在各个场景中活动。场景由多个部分组成,比如说大地我们称为地表;地上的房子、树、城墙什么的,被称为物件;玩家的人物,NPC等活动的元素,被称为活动物件。3D引擎的作用,就是组织好地表和分布其上的物件和活动物件,把它们按照策划和美术同事的设计完美的显示出来。

  在剑侠情缘叁开始之前,我们做了一个小的演示程序。这个演示的主要目的是测试一些关键的技术是不是可行,效果如何,并且为美术同事制定美术元素制作规范提供参考。当时,剑侠情缘叁是一个采用传统2D游戏斜45度视角的游戏,
所以我们的演示程序也是按照这个要求来做的。通过这个Demo,我们主要测试了2D逻辑下的场景管理,3D模型和特效的显示,骨骼和顶点动画技术。

技术测试的3D引擎项目炸弹人

在这个Demo里玩家可以控制一个人物在场景里来回跑动,放置炸弹。玩法和以前FC上的炸弹人类似。当然这个Demo不是说剑侠情缘要做成这样的游戏,他的目的是帮助我们测试上面提到的关键技术,证实已知的方法是确实可行的。测试完成的相当不错,这些技术到现在的都还在使用中。

  有了良好的测试结果, 我们就准备开始大干一场了。在M1的期间(PS,
M是指里程碑,是我们对项目一个目标阶段的说法),我们制作了地图编辑器和特效编辑器。有了地图编辑器,美术同事可以给地表刷上不同的图,表现出草地、沙地之类的变化,然后在刷好的地表上,摆放上房子、路灯、树等等物件,再加上NPC,一个基本的场景就完成了。我们就可以进入到场景里,活动活动腿脚,欣赏下美丽的风景,和NPC做做友好的交流;有了特效编辑器,我们就可以制作火焰、雨雪、水花这些华丽的效果,把这些东西也放到场景里面,画面就显得更有生气了。

  随后我们的工作主要是一些修整和完善。等到WOW推出之后,我们发现2D方式的斜45度视角和WOW的全开放视角比起来,在表现力和游戏体验上都有相当的差距。所以整个项目组在讨论之后,在剑侠情缘叁M2.1的时候作出了一个重大的决定。我们放弃了斜45度锁定视角,转而采用全开放的视角。

  这个决定对3D引擎的影响是巨大的。本来我们采用斜45度视角只要把以前2D游戏的场景管理方式稍加修改就可以了,但改成开放视角之后,需要采用全新的场景管理方式。更要命的是,这个变化不只影响到我们3D引擎,
还影响到美术的的制作。

M1时的剑叁3D引擎截图

  对程序来说,3D场景的管理,是有着成熟的技术理论的支持的。经过一段时间的努力,我们完成了程序上的调整。但是这并不代表整个项目调整的完成。全开放视角对美术的场景制作的观念也带来了巨大的冲击:
以一个房子来说,
在开放视角下,玩家可以从各个角度各个距离观察这个房子,而以前45度锁定视角,玩家只能在一个固定的角度和有限的距离范围内来查看。这就对房子的制作精度有了更高的要求。很多美术之前出于效率考虑采用的优化方法,比如说只制作能被看见的部分,就不能再被使用了。

  开放视角带来的另外一个问题,是可视距离增大带来的场景复杂度的上升。以前斜45度视角只能看到有限的范围,而开放视角之后,如果在平视状态下,视野范围会比以前大很多倍。在程序上,我们采用了LOD技术来动态的调整场景的复杂度,以达到效率上的要求。而对美术来说,
场景的规划比以前有了更高的要求,把很多的东西集中的堆在地图某些区域之内是绝对不被允许的。
如何合理的规划一张地图上的物件,物件应该如何制作才能在画面效果和运行效率间找到平衡, 这些都是急需解决的问题。

  因为美术同事也是第一次制作全3D的地图,缺乏全3D场景的制作的经验。所以他们也做了一个Demo,一张模板地图。最终的选择是剑侠情缘叁的新手村地图。就好像玩家今后都诞生于新手村一样,我们其他所有的地图也都诞生自新手村地图。通过这张地图的制作,美术同事总结出了地图制作和物件制作的规范。那个过程是痛苦而快乐的。痛苦在于很多之前的美术工作被完全的推翻和制作上作出的许多调整;快乐在于开放视角带来的全新游戏体验:忽然可以看到一个广阔的空间的震撼,是每一个从锁定视角游戏过渡到开放视角游戏的玩家都难以忘却的。

 

2008年11月20日 17:25:21  
发表评论/查看评论

 

M2.1改版之后的剑叁3D引擎

  在程序的调整完成之后,我们的程序员爆发出了旺盛的创造欲望。那时显卡的可编程管线技术已经比较普及了,所以我们修改了3D引擎,正式加入了对可编程管线的支持。对于热爱画面表现胜过一切的3D图像程序员来说,
这就好像打开了通往新世界的大门。基于贴图模板的四层地表贴图、法向量贴图、水面反射、全屏幕特效、环境光阻挡图,
预渲染阴影图、柔体,剑侠情缘叁的画面就像从侏罗纪公园回到了现实中。

  在那之后一直到现在, 3D引擎组除了继续美术工具的制作之外,提高渲染效率和效果的变成了我们的主要工作。

  更高的渲染效率,意味着图像引擎可以承受更高的场景复杂度,也就是说可以在场景里面放置更多的东西,
让画面显得更丰富,从而提高整体画面感觉。在这方面我们通过优化场景管理和渲染流程,
并采用了一些DX9的新技术,效率得到了显著提升。然后我们充分使用了这部分优化带来的空闲性能,实现了大规模地形植被(地上长满了各种各样的植物),动态光影(从此不再只有刀光没有剑影了),
并整合了物理引擎(长袖飘飘的效果)。

  在美术的工具上,在完成基本功能之后,我们的工作重点放在了工具的易用性上,主要的方向是制作工具的自动化。举个例子来说,比如需要在地图上的两个地方之间勾出一条道路。以前的做法,是美术用类似画笔的工具在这个路线上画上道路的贴图。设想一下,如果两个点之间有一公里远,那么美术同事就需要用笔刷一点点的涂完这个一个公里的长度。如果有这样一个工具,只要在两个点之间连一条线,并在两点之间根据需要设定一系列的关键点,然后点“确定”,瞬间就可以自动生成一条连接两点,并且经过所有关键点的道路,世界会变得多么美好。

目前的3D引擎效果

  剑叁3D引擎的历史到这里基本上就介绍完了,更多的历史在等待着我们去书写。剑侠情缘叁背负着西山居的光荣与梦想,体现着金山对技术的执着追求,能够参与这样一个激动人心的项目,是我们每一个人的荣幸。

部分同事在去年愚人节剑叁发生大头事件的合照

 

“西山居出品,必属精品!”

  “剑网3真稳定!剑网3真好玩!”

  “不卡号、服务端程序连续运行144小时不崩溃!”

  上述是剑网3项目组全体成员要实现的伟大目标!

软件开发周期性测试

  也许你会问,为什么我们这么重视产品的“稳定”?因为这是结合了西山居人多年研发和运营网络游戏的丰富经验总结出来的,游戏功能可以逐个版本进行完善,游戏流畅度可以一步一步去改善,但是如果在游戏运营过程中,经常出现服务器宕机,客户端程序崩溃,这对于我们广大玩家来说,无疑是当头一棒!极大的影响游戏乐趣。

  我们是如何来实现“稳定”这个目标的?剑网3的测试人员平时都在做些什么呢?通过本文,你将对剑网3的质量团队有初步的了解。也希望大家以后能够给予剑网3这个产品更多的支持!

  剑网3是西山居目前研发时间最长的项目,差不多研发了5年了!“质量第一”是西山居工作室实现精品游戏的第一步,如果质量关没有通过的话,宁可将产品发布时间表推迟,也不能发布一个不稳定的产品出去。

  总体来讲,剑网3的质量人员主要分为“游戏测试工程师”和“测试开发工程师”。当然还有SQA(质量保证组),SCM(配置管理组),这两个组主要工作是项目管理方面。质量人员平时的主要工作是与策划或程序员讨论功能需求设计,进行测试设计(如编写测试方案和测试用例),编写测试报告。

日常代码测试

游戏测试工程师主要的任务目标是确保剑网3的各个游戏功能按照策划案被完整地、正确地实现,实际制作出来的游戏场景与任务要与策划设计的一致,发现的问题或BUG多数为策划设计类和功能类的BUG。例如,游戏场景的风格是否与策划内容一致(如策划设计的是雪地场景,实际实现的也应该是雪地场景,不能在这个场景中出现不协调的场景元素。),功能NPC的功能是否正确实现(如命名为“饰品店老板”的NPC不能同时卖武器),音效是否正确实现(如刀击与棍击的音效是不同的),等等。

  游戏测试工程师的基本要求是对我们的游戏功能和需求非常熟悉。如果你深入玩过多款不同类型的游戏并能够很好的理解游戏系统,并且有一定的编程基础(编译语言不限),就能够更好的帮助发现BUG和提升游戏的可玩性等游戏质量。

游戏测试工程师平时的主要工作有:按版本进行系统测试或功能测试,跑场景(检查障碍、物件、任务、怪物分布等等)、测试怪物AI、检查和测试物品掉落机率、检查NPC对话、测试武功技能等等。同时还会做兼容性测试(如:显卡、CPU、操作系统等等)、易用性测试(如界面操作顺畅度、界面友好度等)。


代码测试工作流程定义

  测试开发工程师主要的任务目标是保障程序代码的质量,同时开发和提供各种调试、测试需要用到的辅助工具,测试开发工程师还需要通过“代码走查”和“单元测试”来发现程序代码规范性问题和潜在的BUG。“让计算机做善长做的事情”----
是测试开发工程师做事的一个重要理念,所以我们开发出了一些自动化的测试工具,如可以自动检查配置表错误的检查工具,可以帮助测试工程师自动跑任务的游戏机器人等。因为我们在每天的凌晨会自动构建版本(通常叫做Nightly
Build),然后会进行自动化测试,所以测试开发工程师每天早上上班第一件事就是看自动化测试报告,这样可以及时地发现每个版本的问题,及时修复。

  测试开发工程师的基本要求掌握较好的编程能力和程序调试能力,有一定的软件系统设计能力,同时对所开发的产品的相关领域知识有一定的了解和掌握,如我们开发的是网络游戏,那么就要会Socket编程,图形编程(如2D或3D),数据库设计与操作等。

  为了更好的说明剑网3质量人员主要的工作任务,给出以下示意图:

  如上图所示,测试开发工程师主要是确保“系统设计—详细设计与编码”这个阶段的相关质量,如系统设计是否合理,算法是否是最优的,代码可读性如何、有没有BUG等等。要特别提出的是,测试开发工程师的工作可以在版本还没有完整编译出来之前就可以开展,也就是说,只要程序员把设计文档写好,或者代码提交到代码库,测试开发工程师就可以开始进行测试了。在游戏测试工程师的工作之前就可以发现一部分BUG。避免这些BUG遗留到系统测试阶段。而游戏测试工程师侧重于发现集成环境下出现的BUG和产品化方面的BUG。

  当然,除了上述说到的要有“专业”的能力外,还需要其它方面的能力,简单地说就是“工作能力”了。网络上有一篇文章,大意是“测试人员必备的十大素质”,有耐心,细心,良好的沟通能力,很好的抗打击能力,较好的总结能力,洞察力,对问题的敏感能力等等。说实话,如果你真的可以同时做到了这些,我可以称你为“神”了!不过作为一名优秀的软件测试工程师(不管是游戏测试或是测试开发),会编程、有耐心、对问题有较好的敏感性、良好的沟通能力确实是做好软件测试工程师的比较重要的前提条件。

就拿耐心来说吧,大家都知道,在游戏研发过程中,会经历无数次的版本集成,也就是说会出无数个版本,对于游戏测试工程师来说,基本上每个版本提交测试后,都需要去将各个场景的任务跑一遍(任务个数成百上千噢。。。),同时还要检查每个NPC和怪物的位置和功能等等,这样做久了肯定会累的。自己想不清楚的话,可能会放弃,如果想清楚了,工作中也经常有一些比较有趣的事情发生。比如为了测试方便,我们的测试工程师们在游戏里一般都是“上帝”。呵呵,其实就是在游戏里可以使用各种各样的“GM指令”啦~~~有了GM指令,你可以随意设置你的角色的等级,获得所有高级装备,学会各种门派的顶级武功,去任何你想要去的地方,这样,各大怪物BOSS当然不在话下,你想怎样孽待这些怪物都可以。哇哈哈~~~不过,有时为了尽量模拟游戏发布后,玩家可能碰到的问题,还是会限制使用“GM指令”的。记得曾经发生过一件很有趣的事:某日测试工程师A创建了一个角色,要测试NPC的一些动作,把村子里面的一个教武功的NPC和周围几个其它NPC杀了,连地上走动的小鸡都不放过,这时在旁边做其它测试的同事发现不能从这个NPC接任务了,然后就开始把追杀他!

工具开发流程

  至此,各位应该对剑网3的测试有了初步的了解了吧?

  总之,我们的目标是做一款精品游戏,做一款好游戏!剑网3的质量保障人员是我经历过的项目中人数最多的,也是最有实力的一支队伍,有了这样一支队伍,再加上一批有做精品游戏理念的项目其它成员,我相信我们能够把剑网3的质量做得足够好,让大家顺畅地、开心地游戏。

游戏开发新手入门指导(Q&A)

DirectX是什么?
  DirectX(简称:DX)是微软推出的一套基于Windows系统的多媒体应用程式接口APIs函式。
  在开发中,DX分为两个部分,一个是运行库,通过DX编译出来的程式必须要有运行库的支持,另外一个是开发库,也就是常说的SDK,这部分是在编译DX程序中是必需的。

  详细原文介绍"DirectX Technology Overview"。

学编程需要哪些书?
  视情况而定,但作为编程基础,编程类的技术书籍是你所需要的;在游戏程式开发方面,我们大致可以将技术划分为如下几个模块:游戏构架、图形图像、图形特效、游戏逻辑、游戏界面、人工智慧、声音音效、网络连接、系统优化等,明确目标后去寻找相关技术类书籍将使你不再迷茫。

VC好还是C++好?
  首先,我们要纠正一个错误的观点,C++是一种语言,而VC是一种编译器软件;VC是一个用来编写(编译)代码的平台,你可以在VC上面编写C++代码。

如何用DirectX制作2D游戏?
  DirectDraw组件是DirectX对2D的主要支持部分,参考文献“从头学习DirectDraw”、"DircetDraw
c/c++ 使用指导(一)"、"载入位图文件到DirectDraw"。

如何使用DirectInput?
  DirectInput是DirectX API的输入控制组件,提供了操作硬件的底层接口,参考文献“DirectInput
鼠标编程入门”、“DirectInput 键盘编程入门”。

如何在游戏中显示文字?
  游戏中的文字显示一般由两种方法来实现,一种是通过调用系统APIs来进行绘制,另一种是通过自己管理字库进行绘制;这两种方法各有优缺,让我们看看它们如何实现的。系统APIs的使用参考"深入WINDOW字型",自处理字库绘制参考"点阵汉字显示"(关于自处理字体的说明,自处理字库就是通过某种存储方式将文字组织保存于文件中,然后在游戏中进行装载和绘制。)。

如何使用DirectSound?
  DirectSound是DirectX
API的音频(waveaudio)组件之一,它可以提供快速的混音、硬件加速功能,并且可以直接访问相关设备,当然,最主要的是它提供的功能与现有的(?将来的呢?)设备驱动程序保持兼容性。参考文献“DirectSound”。

如何在游戏中播放一段电影?
  播放视频片断可以通过DirectShow来进行播放工作,参考文献"在VC中调用DirectShow全屏播放视频"。

如何在游戏中实现半透明效果?
  游戏中要进行(2D)图形的半透明效果主要就是通过alpha混合运算,参考文献"Alpha-Blending
技术简介"、"利用MMX优化64K色Alpha混合算法"。

如何把DirectX关联到VC中?
  我们要进行DirectX程序的编译就必须要有DirectX
SDK库文件,此文件可以到微软或者本站获取,然后通过VC设置将其关联。下面说明了在VC6和VS.Net下的安装方法。
  VC6(英文版):选择菜单Tools->Options,打开Options对话框,选择Directions标签页,选择Include
files项,在里面添加DirectX头文件的文件夹路径目录,同样,在Library
files项中添加DirectX头文件的文件夹路径目录。
  VS.Net(中文版):选择菜单"工具->选项",打开选项对话框,打开Projects标签页,分别选择"包含文件"和"库文件"进行相应的路径添加即可。

  注:VC在进行编译时,会根据排列顺序来进行库文件选取,假设有两个相同名字的库,VC会优先使用排列在前面的库文件。

VC编译DX程序出现"无法解析的外部符号"是怎么回事?
  这个错误经常出现在初学者要进行编译DirectX程序的时候,主要是因为没有将DX的库文件引用到工程中,这里需要注意,我们将DX
SDK的路径设置到VC后,并不代表我们已设置好了DX
SDK,在我们的DX工程中,我们还需要进行相应的设置操作,把我们所需要的库文件(DirectX SDK
Library)加入到我们的工程中,要设置这个库文件有两个方法,一个是在你工程的编译选项中进行添加,另外一种可以通过代码的方法来添加(推荐)。

  命令行:#pragma comment( lib,"xxx.lib" )
  这个是VC的编译预处理指令,将其加在代码中即可。
  例如:#pragma comment( lib,"ddraw.lib"
)  这句的意思是将ddraw.lib库加入到工程中进行编译。
注:此命令行不需要加分号(“;”)。

给C++初学者的50个忠告
  1.把C++当成一门新的语言学习(和C没啥关系!真的。);

  2.看《Thinking In C++》,不要看《C++变成死相》;
  3.看《The C++ Programming Language》和《Inside The C++ Object
Model》,不要因为他们很难而我们自己是初学者所以就不看;
  4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;
  5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;
  6.会用Visual C++,并不说明你会C++;
  7.学class并不难,template、STL、generic
programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;
  8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;

  9.看Visual C++的书,是学不了C++语言的;
  10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?
  11.浮躁的人容易问:我到底该学什么;——别问,学就对了;
  12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;
  13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!
  14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;
  15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;
  16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;
  17.C++不仅仅是支持面向对象的程序设计语言;
  18.学习编程最好的方法之一就是阅读源代码;
  19.在任何时刻都不要认为自己手中的书已经足够了;
  20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;
  21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
  22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
  23.请看《Effective C++》和《More Effective C++》以及《Exceptional
C++》;
  24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;
  25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;
  26.请看《程序设计实践》,并严格的按照其要求去做;
  27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;
  28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;
  29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;
  30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;
  31.学习编程的秘诀是:编程,编程,再编程;
  32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software
Construction)》《面向对象软件构造(Object-Oriented Software
Construction)》《设计模式(Design Patterns)》《The Art of Computer
Programming》;
  33.记住:面向对象技术不只是C++专有的;
  34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;
  35.把在书中看到的有意义的例子扩充;
  36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;
  37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;
  38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;
  39.C++语言和C++的集成开发环境要同时学习和掌握;
  40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;
  41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;
  42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);

  43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;

  44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;
  45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;
  46.记录下在和别人交流时发现的自己忽视或不理解的知识点;
  47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;
  48.保存好你写过的所有的程序——那是你最好的积累之一;
  49.请不要做浮躁的人;
  50.请热爱C++!

MMORPG游戏开发入门

 

 

原著:Radu Privantu
翻译:pAnic

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

  

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

  
  第一步:评估你的能力
  
必须的技能:
  
  1、懂至少一种编程语言。 迄今为止, C++因为性能和效率的优越性成为游戏开发者的首选。 Visual Basic, Java
或者 C# 可能也是不错的选择;

  2、熟悉一种图形库。通常的选择是SDL, OpenGL,
或者DX/D3D。(译者注:网上也有很多免费/付费引擎下载和出售);

  3、选择一种网络通讯库。 你可以从WinSock, SDL_net,
或DirectPlay中选择。(译者注:很多人喜欢开发自己独特的网络库,这并不复杂,似乎ACE也是一种选择);

  4、对游戏开发有大体的经验。例如,事件循环,多线程,GUI 设计,等等。
  
强烈推荐的技能:
  
  1、C/S结构通讯;
  
  2、多平台开发。 你可能希望设计一个MMORPG, 尤其是服务器能运行在多种操作系统。为此,我推荐使用SDL, OpenGL
和SDL_net;

  3、网站开发。如果你想让用户通过网站查看玩家统计,服务器信息和其他信息,这是必须的。(译者注:其实网站可以交给其他人开发,如果有必要的话);

  4、安全管理。你当然不想因为有人攻击你的服务器而浪费时间!

  6、团队组织能力。 你需要一个你能成功领导和管理的团队;

  
  第二步:初步规划
  
  我注意到很多人在不同的论坛发帖子寻找团队开发MMORPG。他们中的大部分是这样:“我们成立了一个公司/游戏工作室,需要3个美工,两个程序,1个音乐制作,等等。为了创新,不要看过去的MMORPG,你有全部的自由用来创造你想要的世界,等等。
我们会在项目完成并赚到钱的时候付给你酬劳,等等”。不幸的是,以现有的技术和带宽,你无法拥有一个动态的世界。
朝向无法到达的目标前进只会导致失败。正确的做法是拿出一些小规模的,功能性强的,可扩展的设计和构架。,
  
基本软件构架
  
  首先,尝试创建一个简单的C/S模型,有如下功能:
  
  1、创建一个新角色;
  2、保存那个角色(服务器端);
  3、用那个角色登陆;
  4、能够和其他人交谈;
  5、能在3D空间游览;
  
  保存角色看起来简单,其实不然。 例如,有两种方式保存角色:使用数据库服务或者使用文件。两者有各自的优缺点:

 

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

 

  现在你决定了如何存储角色,你还得选择C/S通讯的网络协议:TCP 还是
UDP?,我们都知道TCP速度慢,但是更准确,并且需要额外带宽。我实际使用TCP并没有遇到什么问题。
如果你有充足的带宽,TCP是个好选择,至少对初学者是这样。 UDP 会很麻烦,尤其是对新手。
记住,游戏或引擎的初步测试会在你的局域网进行,所有的包都会按顺序依次抵达。在Internet上无法保证这一点。虽然包会按顺序到达,但是有时候会丢包,这通常是个麻烦事。
当然,你可以设计你的协议使得C/S能够从丢包中恢复。但这对初学者来说很痛苦,不值得推荐。

 

第三步:选择数据传输协议
  
  又是看起来很简单,其实不然。你不能只是发送’’’’结尾的串。因为你需要一个通用的协议,能同时适用字符串和二进制数据。用0(或其他字符)做
结束符是不明智的,因为那个结束符可能是你要发送的数据的一部分。此外,如果你发送20字节,然后再20字节,服务器极有可能收不到两个20字节的包。取
而代之的是,它会一次性收到40字节,为了避免浪费带宽在不必要的头上。
而且,你可以发送1KB的包,但服务器会以两个小包的形式收到它。所以你必须知道哪里是一个包的开始,哪里是结束。在
“永恒大陆”(译者注:原文: Eternal Lands,本文的作者正在开发的一款MMORPG)中,我们用如下的方法:
  
  ·Offset 0: 1 字节 表示传输的命令;
  ·Offset 1: 2 字节,传输的数据长度;
  ·Offset 3: 变长,消息内容;

  这种方法有一致的优点:所有的数据传输有统一的标准。缺点是有些命令有固定已知的长度,浪费了一些带宽。以后我们会改成混合的方法。

  
  下一件事是决定服务器模型: “非阻塞soket,不使用线程”,或者“阻塞soket,使用线程”。两种方法(使用线程 vs
不使用线程)各有优缺点。
  
  线程:
  
  1、服务器响应会更加平滑,因为如果一个玩家需要大量时间(例如从数据库中读取数据),这会在它自己的线程中完成,不会影响其他人。(译者注:也许作者的意思是每个玩家都有独立的线程,但这对MMORPG不太现实);

  2、难以恰当的实现和调试:你可能需要大量同步,并且一个小疏忽就会导致灾难性的后果( 服务器瘫痪,物品复制,等等);

  3、可以利用多处理器;

  无线程:
  
  1、实现和调试更简单;

  2、响应速度慢;

  在我的公司,我们使用无线程的方法,因为我没有足够的资源和人力处理线程模式。
  
  第四步:客户端

  
  你打算做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%(程序和美工)之
前,不要浪费时间在网站上。

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

  
  关于作者

  
  这篇文章作者是 Radu Privantu, 永恒大陆(Eternal Lands) www.eternal-lands.com的主程序和项目规划,
永恒大陆是一款免费,客户端开源的MMORPG。

带你参观腾讯公司总部

 

2009年06月30日 15:28:56  转载自 


http://job.17173.com/content/2009-06-30/20090630152856495,1.shtml

 

 

腾讯大楼

腾讯公司总部前台

 

办公室一角

 

 

 

 

会客室,明亮宽敞

 

 

会议室门口

 

 

某会客室。腾讯办公室给人的感觉是色彩鲜艳

 

 

 

 

办公室中研发人员正在努力工作