为什么一些网页游戏服务端架设喜欢用Erlang做服务端

为什么多数游戏服务端是用 C++ 来写呢,是历史原因还是性能方面的考虑?
用 C++ 是历史原因还是性能方面的考虑?感觉 C++ 开发效率相对较低,对开发人员的要求也高,用 C++ 写出一个健壮的服务端确实比较难,为什么很多游戏服务端要用 C++ 来实现?是因为普遍写服务端的前辈是 C++ 出身么,还是说对于游戏服务端来说 C++ 的性能赶超其他语言一大截或者有其他优势,如果不是,现在用什么语言来开发 MMORPG 比较合适呢?感谢大家。
我来说两句吧:目前几乎没有纯粹的 C/C++开发游戏服务端的。早年开发游戏必须用C++,这没得说,年,java还没有nio,其他动态语言不抗重负,只能C/C++能开发出完整可用的游戏服务端。直到2005年,韩国的游戏很多都还是纯C++写服务端,金山之前也开发过很多纯粹C++的游戏服务端,后来大家都切了。现代选择有很多:java + javascript, c+python, c+lua, scala, go, erlang。我们面向性能的服务器用 java,面向逻辑服务器 python,面向高并发的会选择 scala,次一级高并发或者性能测试程序(机器人)会选择 gevent。那是不是我们就不用C++呢?我们用 C来做网络,不用C++,但是C的比例在所有代码中占比有限。这是否意味我们可以放弃C/C++了?也不是:C语言是一把锋利的匕首,而现代动态语言是一把长剑。平时匕首可以藏在身上,大部分时候用长剑披荆斩棘就够了,但当你碰到坚硬的石头,长剑不管用了,那么拿出匕首来果断的切碎他。对于一个成熟领域而言,我的建议是尽量用更高级一点的开发语言,因为游戏开发很多核心技术都有了较为妥当的解决方法。大量的服务端逻辑其实都是在等待,等待网络,等待数据库,这种情况下用C得不偿失。但是服务端有一些地方还是躲不开C/C++,比如当服务器涉及到 3D计算的话(国内很多2D服务端,国外很多3D服务端),大量的矢量矩阵,除了用C++封装出一套好用的数学库外,即便直接用java写,那也是很麻烦的。再比如现在快速动作越来越多,为了让玩家操作更流畅,我需要基于 UDP快速可靠协议,协议开发用 java或者scala,性能上是没办法满足要求的,况且协议实现后要和客户端通信,你没法让所有客户端跟着你一起用java/scala。再比如某些cpu密集的抽象度高的模块,如 aoi或者 ai模块。对于一个新兴领域而言,C/C++很多情况下是你别无选择的东西。比如移动化浪潮刚起步的时候,还没有啥 cocos或者 unity你真要开发游戏,你必须迅速的使用起 OpenGL ES和 OpenSL,然后再叠加某一脚本,以快制胜,第一批移动浪潮上发财的就是这些游戏。又或者,你可以根本躲开,先不介入,等到几年后cocos和 unity成熟了,你在介入用lua / C#写程序。再比如服务端你如果离开熟悉的游戏和web,去开发一个陌生的领域,如流媒体服务,你会发现这怎么和10年前的游戏一样呀,什么高级工具都不给我用用,这时你可以再等个四五年应该高级工具会出现,异或你想领先别人时,你就果断的拿出 C/C++来解决之,这就是C独有的开拓新领域能力。大部分答案都是非黑即白,非此即彼。不要只会C不会动态语言,避免成为一个傻逼;也不要只会动态语言不会C,避免离开熟悉的温室就活不下去。对于一个新手而言,如果什么都没学过,我的建议是先用快速开发的东西,把项目弄起来再说,有精力有机会的情况下,也不能完全放弃一些基础的东西,让自己残缺了。PS:在相同架构下,就纯粹性能而言,各种语言性能差距到底是多少呢?如果只开发回合制这些慢节奏游戏,或者HTTP接口,大部分情况都在等待数据库等待用户消息的话,差别确实不大,的确可能5%都不到。如果cpu密集了,那么可以参考下面的图表,总体来说是10-50倍的性能差别:有人问,说了半天,这个也不行,那个也不完美,而我时间有限,有没有一个更经济实惠的方法呀?如何才一次性达到彼岸呀?时间有限项目吃紧有没有更好的选择?我说有啊!那就是 java。国内游戏开发绕来绕去还是脚本+C+erlang+go,难道大家就不会其他东西了么?大部分可以的情况下,除了非用C/C++,我推荐各位认真考虑下 java,这个性能上最接近C的东西,能承当大部分cpu密集型事务,却又不会象c那样 crash了找都找不到问题在哪里。同时面向高并发时基于原生jvm的 scala可以提供类似 erlang的简单方式,函数式编程 & 大规模并发协程 & actor;同时 java可以很方便的同 javascript结合,js的速度应该是动态语言里面最快的吧。再者 java还有 groovy,可以提供 python/ruby的泛型编程,用超高的开发效率和 python/ruby媲美,同时还能和 scala 结合实现高并发。最重要的是写 java好招聘,到处都是写 java的工程师,大部分语言级的培训都可以省略了。国内游戏开发者很多拒绝学习 java,因为很多开发者自己是碰都没碰过。现在拒绝 java的人,大部分只是在游戏圈子里面打转的人,偶尔开发下 web,缺乏其他行业和领域的经验。看看除游戏外,当今多少世界级的开源服务器是用 java开发的?游戏就真有那么特殊么?我看不是,国外大把java开发的游戏服务端,各位如果知道游戏服务端领域有啥 java技术栈解决不了的事情,麻烦告诉我一声。再看看java上下游的 scala, javascript, groovy这些东西。所以建议各位,有空有条件的情况下,认真考虑下 java技术栈,世界很大,不是只有游戏;即便游戏,现在的开发方法真的对吗?---------------------------------------------PS,刚才又了解了一下,原来国内最近这两年用 java开发游戏服务器是越来越普遍了,比我之前想的还多,这是好事情呀。
先抛出C#开发组的dev manager当初在微软内部一次讲话时说的(大意):相信我,绝大部分C++开发人员花那么几小时或者一两天弄出来的内存管理,除了针对某些特定问题,是无法和我们专门小组花几年时间并根据现代软件各种场景仔细设计后开发出来的管理机制相比的。中国的开发人员其实很有两面性,一方面他们什么都喜欢去讲“用效率最高的”“最强的”,他们认为“C++虽然难以精通,但是一旦精通就是大杀器“(虽然压根就没几个搞懂了c++实现机制。。。),另一方面他们又要抱怨加班,抱怨需求经常变,抱怨不停改bug...中国的程序员从来没有去想过国外程序员经常考虑的一个问题:how to make your life easier?他们觉得凡是把事情简化的,都是loser,都是水平低才做的事情,高手就要用c++...他们没想过什么叫scalability没想过什么叫learning curve没想过什么叫testability老板要他们加快进度,他们说老板不懂技术,说别家用的是低能的php,或者稍微高一点但是还是很low的java,他们说老子用的是效率最强的c++,当然,时间也要多一点。。。尼玛开发时间和debug/fix时间不考虑在“效率”里面?你说他们勤快呢,似乎也是,愿意用最难的工具去做无数简单又无聊的事情(嗯嗯,比如非要用c++处理数据库...)但是他们嘴上说“核心功能一定要保证效率要C/C++",但是却不愿意去分析到底哪些核心达到了必须用C/C++的地步,结果却变成所有东西都是c/c++你处理个tcp连接真心需要c++?你以为java和C++在处理单个tcp handshake的时候有多大本质差别?你存取个redis还一定要c++?何为胶水语言,何为glue language,他们似乎没有概念。服务器后端本来就该是各种语言各种micro service的组合,他们也不理解。之前有人问我我的游戏服务器后端是什么实现,我说我很懒,就是node.js,他立刻抛出这个问题:为什么不用c++呢,c++效率高多了。。。我说为什么你这么觉得呢?他说他之前做个路由的实现,就是用c++额。。。我要说windows kernel里面还有我的代码是C做的呢,我也没说要用C去写服务端。。。不同环境不同需求就该用不同语言和工具,似乎很多人理解不了。。。但是我跟对方说用node.js比较快也容易修改,他就觉得你这是“水平低”的体现,老子就是要知难而上克服技术难关直攀科学高峰。。。额。。。好吧。。。我不会用javascript/html5去写游戏客户端,因为我不敢保证其单机性能,但是后端的瓶颈是在scalability,如果受限于单机效率,那是架构出了问题,而不是用什么语言。我把这个问题总结为:很多人对C++的极端推崇,归根到底是眼界不够广,也不知道不同场景该用什么不同工具,更不知道国外不断推出的python/ruby/node/go/scala 等等到底是为了解决什么问题针对什么场景,不会去选择最合适的工具,只能用他们自己比较熟悉的c++,然后标榜“高效”。其实这个跟政府采购设备反正往最贵的买不会有错,总可以给上面交代,是同一种思维模式。
我个人感觉还是历史原因造成的,跟C++有多么牛逼关系不大。C++在上世界80年代初就出现了,中国第一批程序员大部分都是使用C/C++的,现在牛逼的老程序差不多都是C++出身,做出了很多成功案例,所以在做技术选型时必然首选C++。
其实用C++用的多是国内游戏界,主要是端游界的常态。在国内的页游手游界用的不多,主要是小团队Hold不住。而国外我看到过大把用Java写的,也有用C#的,总的来说没有国内端游界这么一枝独秀的现象。分析原因可能是有以下几个方面吧。从历史原因来说,早期国内游戏研发大公司基本都是用C++写的游戏引擎。可能原因是因为当时可能并没有专业的服务器端程序员,很多程序员都是客户端服务器端两手一起抓。而写客户端基本上就是C++的天下了。所以用同一种语言比较顺手,也不需要重新招聘,就直接用C++来写服务器了。其次可能是当时Java确实也不成熟,在业内没有一个有说服力的案例。.net就更加了。端游行业又是一个很看重成功案例的行业,前一个项目用C++效果不错,可能后一个就继续了。而且当时那一帮人出来创业的话,一定也会用自己熟悉的方案,所以C++就一直流传下来了。从技术原因来看,C++确实是一个写服务器的好语言。范例多,库多,各种底层API支持也好,学校学生学的也多。虽然逻辑写不好容易crash,但是我们不是还有脚本么。而国内流行的Python和Lua嵌入到C++里面又特别方便。而国内运营环境对热更新的要求又特别高(虽然我觉得高强度的加班会显著导致Bug的增加,同时反过来促进了热更新的需求),所以C++做引擎加上脚本语言基本上就变成游戏服务器的王道了。让我推荐语言的话,其实我觉得Java和C++都可以。毕竟现在都是分布式架构。C++的问题是如果要从头写网络框架会很累。Java则有netty和mina这种成熟的网络库。如果要我推荐,我推荐可以尝试一下,感觉可以利用它和组件化编程方式来构建一个不错的服务器集群。不过好像没有游戏公司用这个。可以当一下小白鼠分享经验。
代码的易用性、传承性、容易理解和上手,最关键是要于项目的需求相匹配,这方面要比代码的性能更重要。lua本来就是搭配c++使用的,不同项目比重不同而已,lua有自己的优势,而且这些优势在网络游戏中越发重要。erlang也是一个很不错的服务端语言。php/java等,由于题主问的是mmorpg,并不合适。
(原来反对的高赞已经看不到了。。)答案纯属鬼扯,不像是搞过游戏服务端的。为什么都用C++做游戏服务端?因为用C++做游戏服务端简单。这里说的简单,并不是指C++这门语言简单,而是说,对于游戏服务端开发来说,你用C++来做,可以在领域知识积累的不够多的情况下,也能做出一款在线数量能满足上面要求的服务端框架。十年前,游戏刚成为朝阳产业的时候,网上流传C++实现的游戏服务端框架的趋势逐渐盖过老的mud游戏用的那种单点lpc,大部分都是一个IO线程一个逻辑线程裸跑,客户端直连各种GameServer/SceneServer/ZoneServer(都只是逻辑服务器的代号而已),后端再接个。试想,如果你的程序员只会这样一种简单架构,那是不是唯一能往上跑性能的点只在这个语言的效率本身了?那为什么不能用C++来写游戏服务端?先定义下什么叫游戏服务端。网络IO层不应该算游戏服务端。一般目前现存的、服务端代码中有C++的团队,所谓的用C++,用的最多的地方其实就是网络层。但是一个网络层用C++,其他的逻辑部分用C++去驱动脚本,这种算不算C++开发的游戏服务端呢?我觉得不算,mono的网络层也用C++,但是我上层可以用C#,可以用F#。各种虚拟机的runtime里面,网络层也都要么是C要么是C++,但是我上层用的是其他语言并不是C++。这样来看,我用其他语言写逻辑+C++写网络层和部分底层,性能上跟专业团队维护的runtime会有本质区别吗?至少在性能上并不是数量级的区别。那用C++来写服务端会有什么弊端呢?用C++写逻辑简直是反人类,实现同样一个功能代码量多N倍。C++逻辑出了bug就是能core掉你一组服务器的bug。项目团队大了+再牛逼的人也会有脑抽的时候,线上服务器随时都有core掉的风险。早期端游没多少的时候,是卖方市场,你的游戏挂了我玩家就没其他游戏可玩了。后来端游是买方市场,你的游戏挂了我只要付出成本没多少我一个不爽就换另一款跟你品质差不多的游戏去了。所以热更新已经成为大厂端游标配。纯C++服务端怎么热更新?所以你会听说到/看到腾讯大批老的纯C++写服务端的页游、端游热更新的唯一办法是快速重启。还有一点是高票答案比较扯淡的,所谓游戏是极度压榨硬件性能的。这个对于端游来说,客户端部分确实是,但服务端并不是。正是因为受限于客户端,所以你服务端做单节点上万人是没有意义的,同屏了才有强交互的强烈需求,不同屏的话我干嘛自己找罪受?现在不是十年前了,分布式洗礼游戏行业也已经不是一年两年了。把时间花在节点拆分上的回报率远高于花在单节点在线上。IO线程和逻辑线程的消息队列整各种奇技淫巧的lock-free算法?好吧你写了个看起来没bug的,单节点网络报吞吐量提高了5%。那我把AOI和AI拆成单独的节点好了,整个集群的压测数据提高了50%。那现在为啥还有团队招C++程序员呢?先看下传统C++端游团队的心路历程:团队扩张,要招点业务逻辑狗。C++逻辑程序太特么难招了,低薪程序员成天core,高薪程序员不愿意做业务逻辑狗。怎么办?改改改。担心性能?那我IO线程不改了,还用C++;AOI不改了,还用C++。逻辑线程主循环虽然跑的还是C++,但是python/lua各种侵占的逻辑模块越来越多,一开始可能只是小范围尝试,后来发现:咦?性能影响不是特别大嘛,慢慢的C++那块代码已经没人敢动也没人想动了。再不济,招个大厂出身的、用过bigworld的来做“架构师”,借鉴点大厂泄露出来的ppt讲座什么的,也来搞一组可以热扩展的gate,db前面也挂一组可以热扩展的proxy,再配合一下分线,性能问题还算问题吗?这就是目前国内大部分老的端游团队,所以他们招人的时候为什么喜欢问C++呢?因为他们以前搞C++的对C++熟,C++当面试题逼格高,C++当面试题对老C++程序员简单,面试前一晚翻一本《Inside C++ Object Model》能问翻80%,再随便看看C++新特性,能再问翻15%,剩下的5%是什么?也只剩搞编译器的了吧?咦说好的业务逻辑狗呢?好吧,那究竟该用什么语言写游戏服务端呢?用你喜欢的语言就行。大概分下类:第一类。C++叉某种脚本。优点:一般是大厂职位,技术积累雄厚。缺点:底层部分碰不得。即使有代码你也不敢改,很多都是线上跑过几年的,即使发现有bug你敢改吗?第二类。各种actor模型的服务端开发框架。比如直接Erlang,比如云风的skynet。优点:大部分搞游戏服务端的程序员思维是比较传统的,只认逻辑线程+IO线程的死理,他们虽然没用过actor,但就是觉得MMO拆成actor不靠谱。但是程序员的初心应该就是学习新知识,所以你到这种团队可以远离没初心的程序员接触有初心的程序员。缺点:基本上是限定工作城市在广州了。那现在还有纯C++写服务端的游戏吗?真的难找了。题主思考这样几个问题:广州页游圈多少Erlang的?skynet群里已经有多少实际使用并上线的游戏?腾讯的TSF4G-tapp/SWIFT,还有几个新项目是纯用C++写的so往上面挂?网易出来的团队是不是除了C++叉lua就是C++叉python?
历史原因罢了,端游年代起来的那一拨人从大学开始就都是用C++,到现在这么多年过去了习惯性的路径依赖而已。至于各种推荐C++给大学毕业生用的回答实在只能呵呵了....现在这年头服务端可选的语言非常多,Java/Go/Erlang...随便哪个跟C++比优势都很明显。至于执行效率....不谈实际应用场景就得出C++效率高实在是耍流氓。楼上几个回答Java效率差的,你们实际项目当中有用Java和C++在技术选型的时候做过对比么?有数据能拿出来给我们看看么?连LOL的服务端用的都是Java这种事情我会乱说么?
参与过一个Minecraft大型服务器的后台维护,然后发现好可怕的占用啊,如果是C++肯定不会出现这么恐怖的事情。-------------------------------------------------------------------第一次这么快的拿到2个赞,受宠若惊啊。其实用C++来写服务端确实效率比较低,而且难度比较大,但是往往服务端最讲究效率,像java这类的效率不够的就先不予考虑了。(如果说错了请轻拍)我分割线上的既是玩笑也是真事,正是C++开发难度高,并且对于操作系统等要更加的了解。也就防止了很多水货程序猿来做。就像我说的Minecraft一样,有大把大把的插件和mod,但是由于java的门槛很低,有大把的初中生高中生开发一些东西,如果使用的话,很多情况下会造成卡服,大量资源占用,甚至会崩服。这种事情已经遇到不止一两次了,而且经常我看到好多源码都是把功能全部写在一个文件里面的,由此可见一斑。虽然我用的语言也不多,但是感觉到如果涉及到比较大规模而且对于资源等利用要求很严格的时候,拥有手动内存管理的语言才是首选,每次在java里面我new了一个我总是想去delete掉。更多的时候我们需要的并不是无比多的三方库,而是对于系统资源利用和程序稳定性的尽可能的把握。这一点C++给于了很大的支持。至于赶不赶超一大截我还真没做过基准测试,java很多时候甚至比C++更快,但是。。。java就是一个内存杀手啊你造吗?----------------------------------------------------------------一个晚上莫名其妙的多了几十个赞,这个答案写了有一年多了,解释一下关于MC服务器的情况。MC的官方原版服务器是Java的,就是一个jar包,这个东西是创始人个人开发的,所以根本谈不上这些乱七八糟的,他喜欢用/最熟悉java而已。然后后续有人反编译反混淆了他的jar包导致了三方服务器的出现,随后出现了CraftBukkit,然后是Spigot。这些都是基于反编译反混淆原来的官方代码来的,而且最重要的一点是因为他们用了官方的源码功能,导致了使用java是最快捷方便的途径(我没想到什么比较简便的C++反射java类的方法)。事实上,以性能著称的Spigot自己官方文档都说了,512M内存都只能跑5个人,也就是64G内存也就是500多人同时在线就是极限了,这么算服务器的配置,去现有的云服务器提供商那里几乎要1W一个月,这可玩不起。(自己搭服务器会便宜很多,贵是因为“物业”)。当然这么糟糕的性能指标肯定是有人看不下去的,感谢评论里@ 提供的C++版服务器,我下了一个win64的版本,跑起来用了70M内存,不知道加入玩家会是怎么样的,还待更多的尝试和资料研究(在官方的社区和管理员以及几位开发聊了聊,发现这个服务端代码不太稳定,所以等以后尝试吧。。。)--------------------------------------------------------------最近心血来潮研究了部分现有服务器的代码,这些服务器并不是因为Java而低效,纯粹的是因为官服的代码低效。从跑起来几百人的情况看,官服的代码就是在一个线程上跑到死,2.4G主频的cpu无论你的核心有多少,一个服务端只能撑大概100人保持10tps。相对cpu的瓶颈来说,内存反而不再是重要的的。而且由于数据恐怕是没怎么做压缩处理,1000人保守估计要100Mbps的上行带宽。当然更加深入的研究因为脱离了这个问题的主题,如果有谁感兴趣可以单独开问题我有阶段性结论了回答。
我又是来讲段子的,端游不熟,我说的是页游手游,我们遇到其他团队说自己服务器负载能力不好,总开玩笑问,你们服务器是java的吧。。。。。然而。。。。可悲的是,大部分这个语境下,对方回答,是的。。。。java并不一定注定慢,c不一定注定快,关键是程序员。。。。。。。问题是太多java程序员半吊子还喜欢搞各种奇技淫巧的设计模式,c程序员玩奇技淫巧的相对少一点。。。。我自己更推崇混合编程,适合c的用c,适合脚本语言的用脚本。
你能想象在瞬间要接待大量客户的情况下gc老人家给你停顿50ms吗?在极致要求下一定得是非gc语言做主---这样看来即使不是C++扛把子,也得是C扛把子.
已有帐号?
无法登录?
社交帐号登录像如今比较流行的盛世三国、神仙道、七雄争霸等等?不断的有运营商在运作新的服务器,连360、迅雷这样的老大哥都开始着手这一块了。 问题1、但是我一直苦恼服务端如何得到,又是如何跟游戏开发者合作进行更新? 问题2、是否是开发者卖给各个运营商来进行合作的,特别是一些低端的私人服务器? 问题3、运营商不能买断开发者的游戏的使用权么? 问题4、如果通过非法途径拿到游戏服务端,是否有版权之争?
楼主是这样的,你理解错了。所有的你认为的是私服的都是正版!!!这是网页游戏的运营模式决定的,网页游戏的开发商把游戏交给所有有能力取得用户的运营公司去运营分账。网页游戏不像端游有且只有一家公司运营,一款好的网页游戏几百家运营商去运营都是有可能的。回答楼主的四个问题:1,如何获得服务器端?首先你得有运营游戏的资质,也就是注册资金1000万人民币,其次,开发商考察你的运营能力,觉得你有能力运营,那么就跟你合作。2,那不叫卖,只是合作,并且没有所谓的低端= =,注册资金1000万人民币的门槛能叫低端吗?3,运营商能买断,首先你得考虑你有那个能力吗?神仙道就是心动游戏独家代理的,但是还是要分给N多运营商来运营啊。4,非法,版权之争?= =网页游戏都泛滥了,谁去玩偷偷摸摸的非法的啊。正版之间都争的不得了。
这是联运,不是私服。
这是联运,不是私服。
代理商需要和平台搭建合作关系,由商务人员进行合作沟通,确定运营收入如何分配,一般服务器是由运营平台来出的。有哪个运营商肯花巨资买下一款很普通的游戏嘛,肯定不划算啊。至于非法途径获得服务端由高手回答,不是很清楚。
代理商需要和平台搭建合作关系,由商务人员进行合作沟通,确定运营收入如何分配,一般服务器是由运营平台来出的。有哪个运营商肯花巨资买下一款很普通的游戏嘛,肯定不划算啊。至于非法途径获得服务端由高手回答,不是很清楚。
已有帐号?
无法登录?
社交帐号登录
半神半圣亦半仙,全儒全道是全贤^_^为什么现在的游戏服务端都不用C++,而是用JAVA开发了呀?
[问题点数:100分,结帖人anyue417]
为什么现在的游戏服务端都不用C++,而是用JAVA开发了呀?
[问题点数:100分,结帖人anyue417]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年6月 Linux/Unix社区大版内专家分月排行榜第二2013年5月 Linux/Unix社区大版内专家分月排行榜第二2013年3月 Linux/Unix社区大版内专家分月排行榜第二2013年1月 Linux/Unix社区大版内专家分月排行榜第二2012年12月 Linux/Unix社区大版内专家分月排行榜第二2012年8月 Linux/Unix社区大版内专家分月排行榜第二2011年12月 Linux/Unix社区大版内专家分月排行榜第二2011年10月 C/C++大版内专家分月排行榜第二2011年10月 Linux/Unix社区大版内专家分月排行榜第二
2012年6月 C/C++大版内专家分月排行榜第三2012年6月 PHP大版内专家分月排行榜第三2012年5月 C/C++大版内专家分月排行榜第三2012年3月 Linux/Unix社区大版内专家分月排行榜第三2012年2月 Linux/Unix社区大版内专家分月排行榜第三2011年11月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。最近广州游戏圈有这样的现象了。老板问技术可不可以不要用erlang,换为c++和lua的方式。因为现在招erlang太贵了。
不请自来, 怒答一发&br&&br&现在已经不做网页游戏了, 曾经做过一款3kw级别的页游, 当时在xx99公司, 项目刚立项的时候, 老板要求我用erlang做服务器, 说简单,容易上手, 不会出问题, 而我之前的开发经验基本都是3d客户端, 还给我一本erlang的书籍说让我好好研究下, 说研究完后可以找他要一套erlang的服务器端框架, 估计就是楼上说的传说中的框架, 可是我看完书后, 果断放弃了, 只是对他分布式的设计理念很感兴趣, 决定自己用c++ 和 lua 手动撸一套类似的东东出来, 在老板那边我任然说我用erlang, 其实我用的c++, 也没有找他要所谓的erlang框架.&br&&br&项目快要上线的时候, 老板来问我, 用erlang有啥心得, 我答复&经过对比, 我还是使用了c++&, 老板有些发怒, 因为在老板手上死了n个c++服务器项目, 而且即便上线了还有若干问题, 比如宕机啊, 比如负载啊, 比如热更新啊, 比如跨服啊, 比如开发速度啊, 老板本身不懂技术, 他只知道他被c++程序员坑惨了, 只要听到用c++就不靠谱, 在他眼里能写好c++的程序员, 他认为在当时的xx99不超过5个, 显然这个时候他不认为我是那5个里的一个, 还有一点原因我猜是之前成功的项目没有用c++开发的.&br&&br&老板忍住愤怒问我为什么, 我说, 我研究了erlang, 也了解了目前web game服务器开发需要的技术点, 上面提到的问题都可以解决, 同时表示, 服务器上线 单服 负载人数超过 之前所有游戏, 保证不宕机, 老板表示不屑, 因为之前估计他已经听过n个失败者对他这么讲了, 但事已至此, 老板只能抱着死马当活马医, 或者再被c++程序员坑一把的思想准备. &br&&br&然后又经过一段时间开发, 经过2次压力测试, 项目付费首服上线, 顺利突破8k人同时在线, 没有宕机; 后来我才知道, 这2项数据轻松打破了xx99之前所有游戏的记录:&br&&br&之前erlang的服务器,单服没有超过3k的, 一般1k-2k, 8k在线已经远远突破他们对页游的认知范围, 而8k的时候, 我扫了一眼服务器指标, 大概30%的cpu占用, 后来一机多服, 可以做到单机超过2w人在线;&br&之前的项目首服或多或少宕机(局部宕机), 或者拒绝服务, 首日很平稳的只此一款.&br&&b&以上仅听说, 有误请指正.&/b&&br&&br&&br&通过这个项目之后, 我进入了公司的技术/职级评定委员会, 不定期会有一些技术答辩, 听了很多erlang项目技术实施过程中遇到的问题, 发现 erlang 的项目也不想之前想的那么简单, 关键的负载问题他们是绕不开的, 因为页游滚/导量服的特点, 导致单服2k左右的人数不仅仅技术原因, 也是业务需求, 所以当你问他们为服务器设计上不做到超过5k甚至更高技术指标是, 他们第一反应不是如何做到(我对技术的追求是, 不管业务需求如何, 技术开发中, 要做到效率最大化, 你想2k一个服那是业务需求, 但2k一个服不是我追求的技术指标), 而是业务没这个需求.&br&&br&&br&最后回答题主问题,为什么一些网页游戏喜欢用erlang做服务端?&br&&ol&&li&erlang有框架,能够满足页游业务的开发需求, 业务简单, 对技术指标要求不高;&/li&&li&找不到能够hold住c++的程序员, 同时之前经验让他们对c++开发怕了;&/li&&li&给不了高工资都请牛逼的程序员, 团队的构成普遍是一个高手带一群新人, 新手写c++都是坑, 失败率极高;&/li&&li&erlang对跨服,分布式,热更新解决的比较好,同等的c++开发需要一定架构,技术要求比较高, 很多经验不足的程序员根本不知道c++能做到什么程度, 你让他们找个memory leak都只会打log, 写个aoi同步,只会9宫格同步, 可想而知;&/li&&li&c++服务器一般c++代码的check out权限比较高, 带出去比较麻烦,erlang没有这个问题;&/li&&li&页游就那么几家公司, 前人用erlang,大家也跟着用, 带出erlang代码跳槽,继续用;&/li&&li&开发时间要求, 短平快, 不在乎技术积累.&/li&&/ol&&br&我个人认为erlang仅适合业务密集型的开发,对于计算密集型的开发则比较困难, 需要c-node或者driver配合(这样还不如用c++呢),你用erlang开发个御龙在天服务器, 或者大量物理计算检查的服务器肯定不行.&br&&br&以上仅针对我了解的一般c++开发人员, 高手请自觉绕过, 不要对号入座.
不请自来, 怒答一发 现在已经不做网页游戏了, 曾经做过一款3kw级别的页游, 当时在xx99公司, 项目刚立项的时候, 老板要求我用erlang做服务器, 说简单,容易上手, 不会出问题, 而我之前的开发经验基本都是3d客户端, 还给我一本erlang的书籍说让我好好研究下, …
&a data-hash=&fc63d3c3ee0ea215a9afb3& href=&///people/fc63d3c3ee0ea215a9afb3& class=&member_mention& data-editable=&true& data-title=&@庞巍伟& data-tip=&p$b$fc63d3c3ee0ea215a9afb3& data-hovercard=&p$b$fc63d3c3ee0ea215a9afb3&&@庞巍伟&/a&&a data-hash=&87d4bf8079680cba21166bec38e98dde& href=&///people/87d4bf8079680cba21166bec38e98dde& class=&member_mention& data-editable=&true& data-title=&@猫粮& data-tip=&p$b$87d4bf8079680cba21166bec38e98dde& data-hovercard=&p$b$87d4bf8079680cba21166bec38e98dde&&@猫粮&/a& 等同学的回答基本上都是点中关键点了,但是部分内容需要纠正下。&br&&br&作为算是第一批Erlang应用于webgame(说是始作俑者也不为过)的家伙,补充点当年的实际决策情况,顺便纠正几个错误的认识,也算是自黑了不少:&br&&br&PS:&br&1. 以下内容都是实际在09-10年工作期间的真实情况,但是会尽量少八卦&br&2. &b&选择什么并不一定重要,做出选择才重要&/b&&br&3. 文中如果戳中某些人痛点请不要骂娘&br&4. 目前还在游戏行业,页游、手游领域都有涉及,Erlang也一路坚持了下来,大爱!&br&5. 没深入研究过Erlang的同学,请不要瞎评论了,负点责任好吗?搞得好像自己是个神,不管什么语言写两行就知道精髓了&br&6. 这不是个语言争论的回复,请勿讨论谁更好,但是欢迎讨论各个语言的优劣势以及如何扬长避短&br&&br&&ol&&li&&b&页游07-09,草根的春天&/b&&br&&/li&&/ol&国内页游从07年其实就有崛起之势,特别是“五分钟”团队推出“偷菜”之后,大众对游戏的态度慢慢开始改变,由抵制、打击变为合理的接受。 然而由于webgame门槛低、前期市场规模小、天生基于web,造成了早期的webgame很多都是基于PHP、Java、ASP这些在传统端游开发者看起来很不靠谱的编程语言(在珠三角以PHP最为主流),例如纵横天下、热血三国、商业大亨、弹弹堂、明朝时代等;顺便提下汉森的《倾城》,Java前后端,在当时的视觉效果真的很好,可惜内部出了问题,源码泄露、私服泛滥。&br&&br&明朝时代截图:&br&&img src=&/c678a6f1fbd4bfd0dc5b2fca_b.jpg& data-rawwidth=&380& data-rawheight=&220& class=&content_image& width=&380&&&br&&br&09年我来到《明朝时代》团队时,觉得:我靠,太cool了,PHP居然能够写游戏!!! 居然!!!&br&===&br&呵呵,很多同学可能就会觉得“那是你没见识,游戏的技术早就成熟了,你居然还在佩服这种低级玩意”;对,当时的确是没有见识;但是更多的是当年作为一个新手(只有PHP自学的经验)对技术的渴望 --- &b&技术追求的狂热是被不应该被语言所限制的,就像爱情不分种族&/b&。但是不少同学最觉得只有学习C++才是有追求的【不喜勿喷,你可能不是,但是你看看周围吧,多数的C++同学是这么思考的,等会我还会提个关于C++的八卦】。&br&&br&这个时期页游的特点:技术门槛底、SLG横行、品质离端游差距巨大;由于这些原因,端游方面的人才基本都不愿意去搞页游,非常能够理解这样的想法,因为感觉起来是一种技术倒退;不过就市场来说,产品需求至上,技术是否先进不能代表一切【理性思考方式之一:不要用观点A的正确来证明B的错误】。&br&&br&&br&&b&2.
09-10,我们遇到了问题,认识了Erlang,选择了Erlang&/b&&br&&br&在2009年大概是8、9月的样子,我们看到一款游戏叫做《战斧》(&a href=&///?target=http%3A///newgames/.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&2.5D即时战斗网页游戏《战斧OL》精美截图曝光&i class=&icon-external&&&/i&&/a&),这是一款09年的基于Flash的网页ARPG,当时我们看到demo视频的时候以为是一款客户端(再次原谅我的浅薄,当时真的没有想到网页上可以做出来实时战斗游戏),当时的心情是:我靠,太cool了(=_=!),我们TMD还在搞什么鸟的SLG,技术太落后了!!!&br&&br&&img src=&/80b0a50bd677bbdd29a4db3ee435714d_b.jpg& data-rawwidth=&957& data-rawheight=&596& class=&origin_image zh-lightbox-thumb& width=&957& data-original=&/80b0a50bd677bbdd29a4db3ee435714d_r.jpg&&&br&&br&2009年10月,《明朝时代》由于技术改进,引入了Ejabberd(erlang著名的开源聊天服务套件)作为游戏的聊天服务器,但是在使用过程中遇到了些技术问题,高潮来了:&b&我们在不懂Erlang的情况下,尝试修改Ejabberd的源码,居然解决了我们的性能需求&/b&!当时我一方面佩服我当时的老大,一方面惊异于Erlang的神奇:要是C++端,有个10W行代码,你敢随便改吗?&br&&br&2009年11月,ECUG在杭州召开,我们几个PHP都跑去膜拜各路大神,顺便请教一下他们在Erlang方面的看法。 期间结识了
&a data-hash=&bb26fdd3ad34961de78aeb3& href=&///people/bb26fdd3ad34961de78aeb3& class=&member_mention& data-editable=&true& data-title=&@余锋& data-tip=&p$b$bb26fdd3ad34961de78aeb3& data-hovercard=&p$b$bb26fdd3ad34961de78aeb3&&@余锋&/a& (不用介绍了吧)
&a data-hash=&45b747edfa2eadb6bee32a& href=&///people/45b747edfa2eadb6bee32a& class=&member_mention& data-editable=&true& data-title=&@赵东炜& data-tip=&p$b$45b747edfa2eadb6bee32a& data-hovercard=&p$b$45b747edfa2eadb6bee32a&&@赵东炜&/a& 金尹 (这两位是《Erlang程序设计》的译者)
&a data-hash=&c373fb94fdb7ec4c3a2b35a& href=&///people/c373fb94fdb7ec4c3a2b35a& class=&member_mention& data-editable=&true& data-title=&@许式伟& data-tip=&p$b$c373fb94fdb7ec4c3a2b35a& data-hovercard=&p$b$c373fb94fdb7ec4c3a2b35a&&@许式伟&/a& (许总当年还没有找到golang) 老范(&a href=&///?target=https%3A///p/erlbattle/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&erlbattle -
恶狼战役-&基于Erlang语言的实时技术学习平台[Erl Base actual time technic learnning env.]&i class=&icon-external&&&/i&&/a&) 侯明园、李杰、崔博、Python大妈(一开始没认出来)一大批牛人以及周爱民老师。云风当时路过了下,没有机会深入请教。&br&&br&&br&&br&这次技术会议应该是我目前为止收货最大的一次,当时听了余老大的PPT基本一遍就记住了(不是懂了),后来请教了以上诸位牛人的建议(当然主要还是余老大给的信心),各位也坦言用Erlang必然会遇到些问题,但是说实话,哪门子语言对于我们来说不会遇到问题呢?因此考虑了如下几点之后,我们选择了Erlang作为服务端语言:&br&a. Erlang的入门真的很简单(有同学说不简单,那我没办法)&br&b. 不懂C++,Java呢又觉得臃肿&br&c. PHP当时有团队验证搞ARPG不太适合(c扩展方式我们也搞不定)&br&d. 网页游戏当时“唯快不破”【当时的市场决定的】&br&e. 热更新对于在测试、技术能力上偏弱的一帮人来说,吸引力太大&br&f. &b&1:1模型对于编程复杂度的降低有非常直接的帮助【呵呵,麻烦没有实践过的同学不要瞎批评好吗?有时真的不太懂,你都没有搞过,怎么就敢理直气壮】&/b&&br&g. 天生分布式【谁用谁知道】&br&&br&-----&br&根据 &a data-hash=&dcddeadcb515f393fe29575& href=&///people/dcddeadcb515f393fe29575& class=&member_mention& data-editable=&true& data-title=&@bhuztez& data-tip=&p$b$dcddeadcb515f393fe29575& data-hovercard=&p$b$dcddeadcb515f393fe29575&&@bhuztez&/a& 的指正,用M:N的说法的确更合适,1:1其实是粒度的不同产生的说法,例如一个玩家一个网络进程,就是1:1,但是一个玩家一个进程就不合适了,这个时候可能是1:N了。&br&&br&&b&八卦一&/b&:技术会议本身是开放的,大家有意见讨论是正常的;ECUG杭州期间,Erlang主题的时候(忘记是哪位的主题了),两位C++同学一开始是各自向演讲者提问的,后来两位直接争起来了;随着接触C++同学越来越多,发现C++同学较为容易鄙视其他C++同学的做法,总是认为自己的做法才是符合C++的精髓;结果呢,高手本来就少,还很容易有鄙视链。 这个也是我对C++感觉心累的原因之一(我C++没学好,就不去评论C++本身了)。&br&&br&&b&3. 10年,踩坑、填坑Erlang&/b&&br&&br& 我们团队4个人没有放假,过来公司写代码,因为实在太兴奋了---对于没有写过ARPG的人来说,这实在太让人激动了!&br&我们参考了RabbitMQ的代码结构和网络部分把框架搭建起来了,基本上是三天左右,这期间还一边在看书;使用了google protobuff作为通讯协议,顺便修正了部分protobuff第三库的一些bug,花了一周多时间;然后陆续花了2、3周的时间去做了几个简单功能,创建角色、登陆、场景、组队、怪物、战斗,我们把这个游戏demo称为mgee(mingchao game engine of erlang version,哈哈,好掉渣的英语,当时以为自己能搞个引擎,其实是无知者无畏),至于流传到了多少地方应该没法统计了,有几个三本学校开Erlang课程用的就是mgee作为基础。&br&&br&到了2010.2月X号,我忘记了,反正后天就是年30了,mgee作为demo已经完成了使命,我们压测了一下发现只有500的承载能力,这个促使我们去了解跟多的游戏架构知识。&br&&br&2010.3月,春节回来,我们团队到处找人请假,当时征途团队的技术负责人过来一次过广州,但是比较可惜没能有机会当面请教;后来呢,在网上找到一些资料,讲的是征途、天龙、魔兽世界等游戏的架构(有些是作者猜的),附上一些图给大家看下我们当年看到的资料:&br&&br&天龙服务端架构思路:&br&&img src=&/d625f52305b9aeeba84aec_b.jpg& data-rawwidth=&1289& data-rawheight=&851& class=&origin_image zh-lightbox-thumb& width=&1289& data-original=&/d625f52305b9aeeba84aec_r.jpg&&bigworld:&br&&img src=&/c02bd80b66a171de8eeecfd_b.jpg& data-rawwidth=&456& data-rawheight=&342& class=&origin_image zh-lightbox-thumb& width=&456& data-original=&/c02bd80b66a171de8eeecfd_r.jpg&&&br&&br&&br&QQ游戏大厅:&br&&img src=&/669d4fbd5218_b.jpg& data-rawwidth=&705& data-rawheight=&472& class=&origin_image zh-lightbox-thumb& width=&705& data-original=&/669d4fbd5218_r.jpg&&&br&基于这样的资料和我们自己的经验,我们做了《明朝传奇》,在线最高到了3100。这期间我们搞明白了1:1该怎么用,mnesia该怎么用,哪些东西是Erlang可以搞得定的(除了怪物寻路,其他逻辑都是基于Erlang),最终明白了一个道理:用不用的好看你个人,语言的约束对群体有效,对个体不一定有效(类似统计与概率),我们从来不鼓吹别人去用Erlang(大家为什么用Erlang,我们只能算是开了头,不是鼓吹者),我们只是告诉你,用Erlang也可以用得好。&br&&br&&b&4. 年,Erlang服务端框架简化&/b&&br&&br&当时几个事情促使了我们再往前一步:&br&a. 明朝传奇的代码我们搞的太复杂,开发和运行效率都不够高,代码难以掌握&br&b. 当时光环的 &a data-hash=&77d3ee247abcbf9b56a374f& href=&///people/77d3ee247abcbf9b56a374f& class=&member_mention& data-editable=&true& data-title=&@达达& data-tip=&p$b$77d3ee247abcbf9b56a374f& data-hovercard=&p$b$77d3ee247abcbf9b56a374f&&@达达&/a&来讨论如何一机多服,给我们带来了思路上的很大冲击:成本控制&br&c. 顶端的Erlang不好培养&br&&br&基于上面的原因,我们希望新的erlang服务端框架有如下特征:&br&a. 简单、简单到发指, &a data-hash=&7e33ed00ca544e965b30cdee48ce1d7b& href=&///people/7e33ed00ca544e965b30cdee48ce1d7b& class=&member_mention& data-editable=&true& data-title=&@谢廷宝& data-tip=&p$b$7e33ed00ca544e965b30cdee48ce1d7b& data-hovercard=&p$b$7e33ed00ca544e965b30cdee48ce1d7b&&@谢廷宝&/a& 当时大宝推荐了一种服务端设计的简单标准:有语言经验的人就能看得懂(并非100%掌握),也就是说看到API知道怎么写功能。 这里可能有人会吐槽了,你把框架搞的这么强,那些新人能学到什么? 呵呵,源码在内部是100%开放,每周都有内部分享来分析现有的实现的优缺点,每个人都可以在经过审查后修改核心实现,为什么会限制新人呢?总有些人讨论问题喜欢偷换概念,也喜欢指责别人自己做不到的事情。&br&&br&b. 性能高,上面&a href=&/people/pang-wei-wei& class=&internal&&庞巍伟&/a&同学提到的2000在线是不对的,当时捷游的梦幻飞仙过了4700(&b&不分线、回合&/b&);而我们的《仙落凡尘》则是不分线ARPG的情况下到了服),就当时的CPU和内存使用情况来说,1/3的资源不到。(当时没有办法了,游戏地图设计的不够大,玩家进入游戏后实在太挤了)&br&&br&在原则a的指导下,新人花三天看书、3天写点入门代码,&b&1周的确是可以去写点简单的功能的&/b&。(在珠三角的同学欢迎当面来讨论验证)但是如果你要求1周就能多么熟悉、深入,这谁也做不到。&br&&br&&b&4. ,Erlang在内部算是真正的落地&/b&&br&&br&真要让一门技术变为解决方案,光靠坚持不够,我们在内部也做了一些事情来帮助Erlang在内部至少可以形成简单的生态群:&br&a. 成立虚拟的Erlang框架引擎组,负责在各个项目组之间同步优秀代码、统一基础框架、剥离业务抽象逻辑【由于这边的文化氛围,推进起来相对容易】&br&b. 剥离公用非游戏专用服务,例如mlog(通用日志服务)、mbd(通用大数据服务)、mchat(通用聊天监控服务)、mservice(通用托管服务),提供给各部门各项目使用&br&&br&这样,配合少量开源库,基本上能够做到快速稳定高效,也不会那么容易遇到技术瓶颈,技术的应用方向也不会太狭隘。&br&&br&&b&5. 一点总结&/b&&br&&br&a. 用了Erlang接近5年,越是深入越是觉得Erlang神奇,集中点还是Erlang的设计哲学,这里推荐一篇文章: &a href=&///?target=http%3A///zhengsyao/p/how_erlang_does_scheduling_translation.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Erlang的调度原理(译文)&i class=&icon-external&&&/i&&/a&来了解下。&br&b. 我从c/php/erlang一路走过来,算是对编译型、脚本、函数式语言有个比较横向的了解,推荐时间较宽裕的同学深入学学Erlang,不一样的哲学会极大的丰富你的世界观,影响你的方法论(好吧,看起来有点鸡汤了)&br&c. 像分布式、热更新等都是非常重要的基础设施,真正的高手自然不需要,但是你是否需要这些还是可以判断的(多数人并非天才)&br&d. 感谢 &a data-hash=&bb26fdd3ad34961de78aeb3& href=&///people/bb26fdd3ad34961de78aeb3& class=&member_mention& data-editable=&true& data-title=&@余锋& data-tip=&p$b$bb26fdd3ad34961de78aeb3& data-hovercard=&p$b$bb26fdd3ad34961de78aeb3&&@余锋&/a& 这样的人一直在坚持,总有人会让你觉得感动,感动于他们的坚持、分享,世界并非非黑即白,而是多姿多彩。Erlang、C++、C、PHP、Scala都是一部分。&br&e. 你或者你们团队用不用Erlang,要看你或者你们团队的经验、产品需要、职业发展、成本等来综合考虑,并不是一句话能够说明的清楚的。而我只是想说一般来说,坚持能解决大部分问题,没有多少所谓的弯路,Erlang和C++等语言谁好谁坏也不是一句话能定论的。&br&&br&&b&6. 其他补充&/b&&br&&br&&br&a. 当年的游戏服务端demo:&a href=&///?target=https%3A///qingliangcn/mgee& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&qingliangcn/mgee · GitHub&i class=&icon-external&&&/i&&/a&
等同学的回答基本上都是点中关键点了,但是部分内容需要纠正下。 作为算是第一批Erlang应用于webgame(说是始作俑者也不为过)的家伙,补充点当年的实际决策情况,顺便纠正几个错误的认识,也算是自黑了不少: PS: 1. 以下内容都是实际在09-10…
已有帐号?
无法登录?
社交帐号登录
七分真,两分调侃,一分假http://127.0.0.1:EVGNMMPkuxt7zgqbRCMeTx8E9tJUh}

我要回帖

更多关于 烈焰网页游戏服务端 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信