查看原文
其他

程序丨如何成为一名优秀的网络程序员(二):实践与经验

2017-05-08 赵菁菁 Gad-腾讯游戏开发者平台

翻译:赵菁菁(轩语轩缘)

审校:李笑达(DDBC4747)


系列回顾:

如何成为一名优秀的网络程序员(一)


在本文的第一部分,我解释了什么是网络程序员,为什么这么多的公司渴望雇佣到他们,以及想要成为网络程序员应该学什么课程知识。


但是网络程序员需要了解的知识大部分都来自于制作游戏的实际经验。本文列出了四个小游戏,初学者或学生可以试着制作这些游戏来获得一些处理网络系统经验。我也会提到一些网络程序员面临的更高级的挑战,所以你可以深入了解到这个工作到底是做什么的。


你现在能做四款游戏


在一个单玩家游戏中,如果软件编写得很差,妨碍到了你的游戏,你至少可以让玩家卸载游戏,但是在互联网上这是不可能的。


要获得一些实践经验,你需要编写一些游戏。如果可以的话,在上学的时候建立这些游戏。大多数课程都有一系列实用的编程项目,这些项目让你可以选择你想要实现的东西,而说服教授让你开发电子游戏并不是什么难事。


下面给出的四个游戏以难度递增的顺序排列,这样你在一个游戏中学到的东西将在下一个游戏中有用。


游戏1. 多人俄罗斯方块:基本网络


这是俄罗斯方块,但是是多人的。够简单吗?


由克隆一个双玩家俄罗斯方块开始。这可以测试一下你对于发送和接收网络消息理解到什么程度。你所做的就是在两台机器之间建立一个基本的双向通信系统,让他们一起玩一个非常简单的游戏,一个这么简单任务,在游戏中你应该有很少甚至不犯错误。因为这个游戏是相当基础的,你可以集中所有经理来修复网络代码中的bug。


克隆一个多人的俄罗斯方块也会迫使你开始思考网络编程的两个基本问题:延迟和分布式状态


你可能会在初始代码中发现错误,这些代码造成了巨大的延迟问题,但你应该能够很快解决它们。同样,你可能会发现,两台计算机正在运行不同的俄罗斯方块游戏,是因为你共享状态信息的错误。同样,涉及到这么少的数据,你应该能够快速调试和修复问题。


对于奖励积分,让游戏与两个以上的玩家交互。尝试三个,甚至六个。(提示:可能开始时两个玩家进行点对点,但对于许多玩家来说,如果你有一台电脑作为服务器,其余的都是客户端,那么开发和调试就容易得多)。


Netris,一个俄罗斯方块的网络克隆


游戏2.RPG:验证,数据库,持久性


现在,试着制作一个传统的地牢探险游戏。造一个地牢,放进去 41 36077 41 15089 0 0 4192 0 0:00:08 0:00:03 0:00:05 4192些龙,留下各种致命的杀戮设备,这些设备躺在地板上或在上锁的箱子里,都很有价值。在顶端放一系列冒险家,让他们去野外冒险吧!


构建这个游戏可以让你专注于持久性,在游戏的连续运行中存储信息,这样每个玩家都会随着时间的推移逐渐增加游戏中的角色,而不是每次游戏开始时都重新开始游戏。


这也是第一个实时聊天真正有用的游戏。聊天很简单,但在早期这是值得学习的,因为这是玩家体验的重要组成部分。之后你可能想换成语音聊天,但现在文本聊天就已经够好了。


你需要一个数据库,你会得到实际的经验,精心编写SQL查询,无论是创建还是修改数据,还有再次读取数据库。


第一步应该是验证,也就是验证用户和密码,否则你的玩家将没有办法确保得到自己的持久化数据——不是其他人的信息。对于这类游戏,你只需要考虑用户名,密码,电子邮件地址,不需要做任何授权。不同的是,验证回答了“你是谁?”的问题,但是然授权问了“既然我知道你是谁了,应该允许你做什么?”的问题。


对于奖励积分,添加游戏中的关卡数据编辑——如地牢中的项:它们是什么,它们在哪里?——以及字符数据(玩家统计数据),使用多级授权系统(“标准”帐户,“编辑”帐户,和“管理员”帐户,这些账户可以授予或撤销访问编辑器的授权级别)。


通过文本聊天的API接口发送和接收游戏中的消息,这些消息可能来自于你游戏之外的好友,将文本聊天与一个或多个流行的即时通讯网络集成。在你的传出消息中嵌入一个游戏下载页面的链接,看看是否可以只通过发消息就让大家都跳转到你的游戏。


游戏3.RTS:确定性,重演,同步


你做了一个简单的实时游戏和一个简单的持久性游戏,但迄今为止还没有遇到任何经典的大型网络编程问题。下一个游戏就会发生变化了,是时候学习决定论了。


这里的目的是创建一个自上而下的实时战略游戏,一百个或更多的单元在地图上运行,这些单元蜂拥到你对手的基地,在图形用户界面上所有的单元都没有明显的减速。


最好的办法是让你所有的计算都是确定的,而不是要把每一个计算结果都通过网络发送,你可以把每个玩家的输入发送给对方,所有玩家的机器都可以自己算出所有其他电脑的情况。这种方法极大地减少了网络的信息量,但如果系统中存在一点点的不确定性,它都可能错得离谱。


要使这项工作正确并在良好路径搜索算法中体现较高性能,你有很多可琢磨的地方。如果你做错了什么,你的单元就会开始在奇怪的方向上游荡,或者被迫中止而不能再继续下去。或者,如果你试图跳过确定性,你会很快发现共享数据的体积和计算是如此之大,以至于你不能让游戏以一个良好实时速度运行。


但是,记住,“确定性”并不意味着不能有随机数——它只是意味着你必须给它们种子。


对于奖励积分,也要实现一个完全确定的AI。


也可以读一下Paul Bettner和Mark Terrano2001年的论文, "GDC 2001: 1500 Archerson a 28.8: Network Programming in Age of Empires and Beyond."


暴雪星际 2


游戏 4. 赛车:低延迟,插值,决定论


最后,最难的“简单”多人游戏:赛车模拟器。从表面上看,它看起来并不那么棘手,但当你提高了汽车的行驶速度,并开始思考它在互联网中携带的数据包在往返这段时间内可以走多远时,问题真的会出现。每小时行驶300公里,一辆车每200毫秒行驶16米,这使得隐藏延迟变得特别困难。


但是,利用你完全确定代码和确定性AI的经验,你可以开始尝试采用插值和DR技术,可能不仅是估计车的位置,对于估计从几帧前到你刚发现它的实际位置的可能位置也有效。


对于奖励积分,制作一个电子光周期游戏,90度瞬间转弯,在致命的碰撞发生之前有很短的道段。


职业生涯


如果你对本文提出的概念和挑战感兴趣,而且你也正在考虑网络程序员的工作,那么你还需要考虑有一件事:你的职业发展。


如果你想成为一个伟大的网络程序员,你在这条路上能走到哪里?简单说,在成为一个标准程序员之前,你可能要花几年时间做一名网络初级程序员(一名有经验的雇员,而不是刚毕业年轻人的那种初级员工)。


在这一点上,对于学生以及没有经验的程序员来说,现在选择成为一个网络程序员不会太多改变你未来的职业选择,因为现在改变主意还不太晚,找到其他一些你愿意专攻的技术领域也不晚。换句话说,决定尝试网络编程有关职业不是一个不可逆转的选择。


但是,如果你选择继续从事网络这一行,你的研究和早期的经验将有助于你更快地上升到高级网络程序员的位置——不只是一个有经验的雇员,而是一个网络领域的专家。如果你想超越这一步,不仅仅是编程,你需要开始做更多事情。


最高级别上两个主要选项是首席程序员和技术总监(再次强调一下,这些职位都与你选择的专业无关,它们只需要正确的个性、非常强大的编程技能,而且有很多的游戏开发经验)。首席程序员主要管理编程团队中的其余人。他们一周周地组织程序员,给大家的时间表,让大家在最后期限前完成,并担任团队其他人的代表。首席程序员也将引导整个编程团队,利用他们作为游戏开发人员多年的经验,在个别程序员遇到瓶颈时帮助他们认识到问题并提出良好的解决方案。


另一方面,技术总监一般都是优秀的高级程序员,但不止是全才。一位优秀的技术总监对编程有着广泛而深刻的了解,既有良好的技巧,又有问题和解决方法。他们从编程的日常工作中解脱出来,而是提前看日程安排的内容。他们试着及早发现技术问题,在问题发生之前就着手解决问题。他们对于编程团队是非常宝贵的,经常用他们的知识和技能帮助任何需要他们的人。他们很少直接管理,而是把大部分时间花费在技术问题上。


现实地说,在游戏开发的世界里,所谓的技术问题往往与代码无关。例如,找到拥有合适技能和经验的新程序员是多么困难,技术总监经常参与招聘和面试。


MMOG开发:挑战和课程


这是本指南的范围之外的,提供了一个关于MMO游戏开发的指导,但它仍然是网络程序员最流行和增长最快的流派之一。


如果你想知道读到这里有多少其实是MMOG开发相关的,答案是“全都相关”。但对于那些对制作网络游戏特别感兴趣的人,你需要学习几件事,和各种你面对的略有不同的挑战。


MMOG全都是关于系统开发的。代码的问题往往不是“这不好使”,而是“现在这是好使的,但在最终游戏环境中不好使”。性能问题不是“它太慢了”,而是“系统根本上无法工作是因为一位(one bit)非常缓慢”。MMOG网络程序员花费大量的时间去选择和提炼设计架构,很少关心具体特点。他们花更多的开发时间来调试架构问题,而不是仅仅是功能性的问题。修复一个功能漏洞可能需要数小时或数天,但修复一个架构可能需要数周或数月。


MMOG网络程序员需要在三大领域发展专长:分布式系统编程,系统的部署和扩展性。


分布式系统编程。除了在这篇文章的第一部分建议的课程外,MMOG网络程序员需要熟悉所有主流的系统架构及其优缺点。例如,DOA和SOA之间的区别,为什么你会选择一个而不是另一个?


这样的问题可以简单回答,但你必须学会详细回答,因为这将是你的游戏设计与不同架构行为之间的匹配细节,这决定了整个系统的成败。从这个意义上说,它非常类似于数据结构和算法课程——它是关于从许多可用的选项中选择最合适的方法。


学什么:反黑客(安全架构)。目标体系结构(服务器间的关系,数据流)。分布式编程(多线程,聚类,信息系统,事务完整性)。抗欺骗或bot-farming(数据库和日志分析)。


网络创世纪,经典


系统的部署。因为MMOG开发非常注重系统,它也极其依赖于运行的硬件。看似微小的变化,如添加或删除百分之10可用的RAM,都可能产生效果不够好和灾难性故障之间的差异。如果你可以的话,了解一些部署系统的实际情况(硬件、操作系统、操作系统服务、配置管理、数据管理)。这将有助于你了解系统级别的故障,你就尽量避免这些问题。


学什么:数据库优化(内存数据库缓存)。服务器同步(共享数据所有权,读/写优化)。客户支持工具(Meta信息、报告、个人数据库回滚)。


可扩展性。从根本上说,玩家越多,MMOG的开发越困难。随着玩家数量的增加,每一个问题都会扩大——但是大多数的技术解决方案并没有相应的扩展。相反,这些方案只会破坏问题。


了解系统的工作原理会为你提供新的方法来处理扩大的规模——更多的玩家,更多的客户,更多的数据,更多的流量,更大的数据库,更多的资源争夺,更多的故障模式,等等——但你需要开始思考规模本身。


理想的情况是,你应该在游戏开发的早期决定你想要达到的目标,然后选择解决方案和系统设计。


例如,在单个物理服务器上支持10000个并发客户端的技术需要更多经验丰富的程序员和多达10到20倍的工作时间来实现,但服务器可能只处理十个玩家。选择错误的方案意味着要么重写大量的代码,要么不必要地增加你的开发时间。在实践中,非常难得到正确的管理规模。犯错误是痛苦和困难的,但不是不可逾越的。即使原本《网络创世纪》的目的是针对于成百上千的球员,但最终有成千上万的人在玩。


网络编程的乐趣


从长远的未来考虑,有抱负的游戏程序员应该考虑网络编程工作,为了在全球都能找到工作(例如:MMO在韩国广泛地更受欢迎,比在其他任何地方都受欢迎)以及不错的薪水。这个职位也有相当好的工作安全性,因为许多网络程序员在游戏中需要培养的技能都可以转移到其他行业。对于年轻和顽强的程序员来说,成为网络程序员是一个幸运的目标,会带来精彩的个人上和专业上的回报。


Adam Martin,NCsoft Europe的首席程序员,喜欢解决在线游戏编程中的难题,他已经花了近10年时间寻找这些问题。一路上他拥有自己的专利技术,为宝石4和5游戏编程,并建立了一些初创公司。他的博客中有更多关于编程的建议和实用性技巧。

笔者特别感谢Jason Beardsley帮助完成这篇文章。


【版权声明】

原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权


今日推荐


干货!深度解析游戏引擎开发中的算法

虚幻引擎4:用C++实现一个近战连招系统

教程:制作一个类似《神秘海域》的装备系统



添加小编微信,可享双重福利

1.加入GAD程序猿交流基地

获取行业干货资讯,观看大牛分享直播

2.直接领取60G独家程序资料库,地址在小编朋友圈

包括腾讯内部分享、文章教程、视频教程等全套资料

 

↓长按添加小编GAD苏苏↓


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存