『码农虾扯蛋』之游戏后台杂谈(壹)

发表于2015-10-23
评论5 4.7k浏览

前言

撸主踩坑游戏后台N年,受摧残无数,在饱受蹂躏的过程中,因为工作关系,有幸见识过不少项目的架构和实现方式;也因为熟识的兄弟各奔西东自立山头,领教了一些小公司的后台生存之道。些许感悟,抛砖引玉,望高人指点。

 

 

关于语言

做游戏,先得要做,怎么做,刚学编程的毛头小子都知道,写代码啊。OK,第一个问题来了,怎么写?用什么写?这tm不是废话么,用电脑,拿键盘写啊。呃呃呃,看本节标题就知道啦,是问用什么语言,什么programming language好么。

说道这个问题,这是撸主脑子里的第一个想法。

写后台,不都C/C++的么,刚入职互娱的某些毕业生会这么说。嗯,这是因为你只在鹅厂呆过。

java写的后台你见过吗,比如,七雄?

呃呃呃,好像erlang也是有的,页游时代曾经风靡羊城。

请不要忘记php哟,gfw外面的facebook可玩的欢呢。

对了,其实js也可以做后台的,还有ASP、C#神马的……

撸主还能不能好好聊天了,尼玛再说下去,是不是所有语言都可以写后台了!

其实,撸主想说,事实就差不多这样,但撸主还没有说完,客官您有见过一个游戏后台N个模块分别使用N种语言,没有?撸主见过咧,然后,然后这就游戏就死了……

 

喂,撸主,屁放了这么多,能不能说重点?

客官您别急,待小生慢慢道来,关于语言的,网上有系列比较,蛮形象,但正确不正确,客官您自个看:

对程序员来说,编程语言就是武器,但有的武器好用,有的武器不好用,有的武器甚至会杀了自己。

C 语言是 M1 式加兰德步枪,很老但可靠。

C++是双截棍,挥舞起来很强悍,很吸引人,但需要你多年的磨练来掌握,很多人希望改用别的武器。

Perl 语言是燃烧弹,曾经在战场上很有用,但现在很少人使用它。

Java 是 M240 通用弹夹式自动机枪,有时它的弹夹是圆的,但有时候不是,如果不是,当你开火时,会遇到 NullPointerException 问题,枪就会爆炸,你被炸死。

Scala 是 M240 通用机枪的变种,但它的使用手册是用一种看不懂的方言写的,很多人怀疑那只是一些梦话。

JavaScript 是一把宝剑,但没有剑柄。

Go 语言是一种自制的“if err != nil”发令枪,每一次发射后,你都必须要检查它是否真的发射了。

Rust 语言是一种 3D 打印出的枪。将来也许真的能派上用场。

bash 是一个十分碍手的锤子,你抡起它时会发现所有东西看起来都像钉子,尤其是你的指头。

Python 是一种“v2/v3”双管枪,每次只能用一个管子发射,你永远不知道该用哪个管子发射好。

Ruby 是一把外嵌红宝石的宝刀,人们使用它通常是因为看起来很炫。

PHP 是水管子,你通常会把它的一段接到汽车的排气管,另一端插进车窗里,然后你坐进车里,开动引擎。

Mathematica 是一种地球低轨道粒子大炮,它也许能够干出很神奇的事情,但只有付得起费用的人才能使用它。

C#是一种强悍的激光大炮,架在一头驴子上,如果从驴子上卸下来,它好像就发不出激光。

Prolog 语言是一种人工智能武器,你告诉它要做什么,它会照做不误,但之后,它会弄几个终结者出来,烧掉你的房子。

Lisp 语言是一把剃须刀,有很多款式。只有寻求刺激和危险的人才会使用它。

该转载的,转载了,篇幅也凑够了,语言比较的讨论撸主必须一言不发,这就是个无底洞,谁跳谁傻×,咳咳咳。

不过关于语言选择,撸主还是有话说,选哪种语言,绝对不是因为它好,只是因为它在那个时候那个地点,是合适的。比如,客官您在鹅厂后台搬砖,大家搬的都是C/C++的砖,您非要搬个java的,也不是不行,您家包工头同意么?搬砖流水线要不要为您重新弄一套? 搬起转头来,有没有之前快?万一您拍屁股跑路了,有没有人来擦屁股?

为毛前几年羊城N多erlang游戏后台?有无码erlang游戏框架流出,你懂的,我是老板我也用啊,自己找人撸基础框架,费时费力还不见得好用,何苦来。

唉,为毛也蛮多小公司用java的,用C++不是挺好的么?唉,客官,C++的码农贵啊,java,早些年北大青鸟可以量产啊,那便宜的,市面上的会java的猴子也好找,好多程序猿抢着来呢。

不对啊,撸主你扯屁半天,都没说效率什么的,不合适吧,C/C++多快啊,数量级的差别好吗?客官,外面混口饭吃的公司,做个游戏单服常年百来人在线就能吃饱肚子,千把人在线就可以烧高香了,要那么高效干嘛,能活下来才是王道啊。我这一开五菱宏光路边卖水果的,您非要我上volvo重卡,真心养不起啊。海量服务?当然重要,不过那是BAT的事,外面的小屁民,连个羽量都不一定够得到,海量就看看好啦。

BTW,撸主还是忍不住再P话一下,业内某颇有名气公司,开发最擅长的是X(ia)J(i)B(a)L(uan)X(ie)模式,各种原始各种艹,但是,还是能用,咳咳,吾等互联网大量服务就是这么个水平,深感在鹅厂好开心好稳定好幸福~~~

关于系统/OS

做游戏,后台改用那个系统?又是个蛋痛的话题,说不好又要被人喷,说的好,那是不可能的……

大家熟知的几大互联网公司,以及外面不少大大小小的公司,在后台系统这块,Linux可以说是占据了统治地位,可以这么类比,和PC上Windows的垄断有那么几分相似。是什么让众多高中低逼格的码农,都倾向选择Linux咧?

有人说性能,比如JVM在Windows和Linux的性能对比(撸主未核实);有人说开源,一切尽在掌控(前提是有能力);有人说社区,各种资源以及支持好;有人说稳定,Linux可以运行N年不重启;有人说免费,零成本;还有人说blablabla……

恩,大家都这么说,也是蛮有道理的。撸主之前看过一些讨论,有些观点撸主表示赞同,Linux 之所以能够达到当前的规模,技术上的优势是次要的。决定 Linux今时今日地位的是“网络效应”

听起来和前面Windows在PC领域的类比有点像,其实就是一回事,再多说一句,这和QQ统治PC即通领域也是一个道理,客官您已成年,估计您这辈子有三个数字是不会变的了:身份证号,身高和您宝贵的QQ号。

再再多放个屁,还有句经典的话:“你来是因为产品,你留下是因为生态系统”。

回到最初的问题,我们应该作何选择?取决于你需要生存的环境和条件,你是白手起家从头开始,还是网络逻辑各种组件健全?是在现有项目上删删改改,还是拿起工具重新搭积木?根据实际条件做决定才是明智的,比如在鹅厂,我们拥有tsf4g等各种成熟的组件、运维工具和开发经验的积累,Linux便是不二的选择;又如,某游戏公司已有成熟运营多年的Windows后台MMO游戏,相关组件工具足够新项目,顺势而为继续Windows开发,也都不是坏事。So,what's your decision?

关于架构

一般来说,恩,一般来说,游戏后台架构可以分为4层:接入层、逻辑层、转发层和数据层。一般的游戏,上至QQ游戏承载千万级玩家同时在线的大游戏平台,下到最简单的分区分服功能极为简单的游戏,也基本是按这个套路走,只不过在个别点上有扩展或者简化。

神马客官您不信,撸主给您两个例子:

上面两个都是QQGame后台架构的示意图,一张旧一点一张新一点,大体差不多就好,请不要在意那些细节。

玩家通过接入层Lotus/SeedSvr与逻辑层游戏服务器交互,游戏服务器之间以及与数据层的存储服务通过转发层Proxy完成。周边系统?图上可能没有表现的很清楚,实际也是通过Proxy进行中转。恩,咋一眼看起来并不是很复杂是么。

撸主在此要膜拜奠定QQGame架构基石的大神曾总,在曾总及多位T4和准T4大佬努力下,QQGame方才取得此不易成就。QQGame历来高人众多恕不能一一列举,放上曾总照片镇楼。

跑题跑完,我们看第二个例子,撸主负责过的一款游戏,鹅厂第一款自研页游『烽火战国』的后台架构:

烽火分区分服,单区承载量远小于全区全服游戏,在架构层面,比QQ游戏要简化很多,但依然没有逃离4层架构的五指山:玩家通过接入层EnpSvr连接到逻辑层游戏服务器MainSvr,而MainSvr则直接与数据层服务器DBSvr链接。唯一缺少的,是转发层,因为在不分线单机单进程单线程的MainSvr框架下,业务已经hold住万人以上同时在线的压力,转发层并无存在的必要,所有业务逻辑均可以集中在MainSvr里面完成,非但简化了架构,也提高了开发效率,何乐而不为呢。

OK,前面说的鹅厂的,外面的兄弟们怎么折腾?其实万变不离其宗,基本还是按照这个套路走,君不见还有直接拿tsf4g组件出去开搞的呢,诶,好像说漏了什么。有不按常理出牌的么?有,不过很少,小团队受人员限制太大,来个人走个人,当然得是相对重要的牛人,都可能导致架构的变更,负责不同模块的人自己瞎jb倒腾,弄出来架构看起来复杂的一逼,最后把自己坑死的也不是没有。Simple is the Best,简即是美,说起来简单做起来难咯,呵呵呵。

另外,再说个自己打脸的话,这个分层是tm虚的,都是这样,也就没啥好说的了。真正有搞头的,在于各个层次内部如何根据项目需求有效的设计和组织,在满足产品要求的前提下,各层间如何高效的联系起来。但是这个,滔滔江水好深咯,必须结合项目说才有意义,鉴于篇幅以及撸主本人水平实在有限,说不清楚也不好说,等下次撸主兴起,再和大家扯淡,哎哟卧槽,为毛有人打我,不要打脸啊!!!

 

码字半天,第一篇算是写完,撸主还是该干嘛干嘛去吧,诸位看官再会。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引