本文非原创,是转载:

原创作者:庆亮
原文链接:

https://www.zhihu.com/question/20405300/answer/45747560https://www.zhihu.com/question/20405300/answer/45747560
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作为算是第一批Erlang应用于webgame(说是始作俑者也不为过)的家伙,补充点当年的实际决策情况,顺便纠正几个错误的认识,也算是自黑了不少:

PS:
1. 以下内容都是实际在09-10年工作期间的真实情况,但是会尽量少八卦
2. 选择什么并不一定重要,做出选择才重要
3. 文中如果戳中某些人痛点请不要骂娘
4. 目前还在游戏行业,页游、手游领域都有涉及,Erlang也一路坚持了下来,大爱!
5. 没深入研究过Erlang的同学,请不要瞎评论了,负点责任好吗?搞得好像自己是个神,不管什么语言写两行就知道精髓了
6. 这不是个语言争论的回复,请勿讨论谁更好,但是欢迎讨论各个语言的优劣势以及如何扬长避短

  1. 页游07-09,草根的春天

国内页游从07年其实就有崛起之势,特别是“五分钟”团队推出“偷菜”之后,大众对游戏的态度慢慢开始改变,由抵制、打击变为合理的接受。 然而由于webgame门槛低、前期市场规模小、天生基于web,造成了早期的webgame很多都是基于PHP、Java、ASP这些在传统端游开发者看起来很不靠谱的编程语言(在珠三角以PHP最为主流),例如纵横天下、热血三国、商业大亨、弹弹堂、明朝时代等;顺便提下汉森的《倾城》,Java前后端,在当时的视觉效果真的很好,可惜内部出了问题,源码泄露、私服泛滥。

明朝时代截图:
<img src="https://pic3.zhimg.com/c678a6f1fbd4bfd0dc5b2fc16221793a_b.jpg" data-rawwidth="380" data-rawheight="220" class="content_image" width="380">

09年我来到《明朝时代》团队时,觉得:我靠,太cool了,PHP居然能够写游戏!!! 居然!!!
===
呵呵,很多同学可能就会觉得“那是你没见识,游戏的技术早就成熟了,你居然还在佩服这种低级玩意”;对,当时的确是没有见识;但是更多的是当年作为一个新手(只有PHP自学的经验)对技术的渴望 --- 技术追求的狂热是被不应该被语言所限制的,就像爱情不分种族。但是不少同学最觉得只有学习C++才是有追求的【不喜勿喷,你可能不是,但是你看看周围吧,多数的C++同学是这么思考的,等会我还会提个关于C++的八卦】。

这个时期页游的特点:技术门槛底、SLG横行、品质离端游差距巨大;由于这些原因,端游方面的人才基本都不愿意去搞页游,非常能够理解这样的想法,因为感觉起来是一种技术倒退;不过就市场来说,产品需求至上,技术是否先进不能代表一切【理性思考方式之一:不要用观点A的正确来证明B的错误】。

2. 09-10,我们遇到了问题,认识了Erlang,选择了Erlang

在2009年大概是8、9月的样子,我们看到一款游戏叫做《战斧》(2.5D即时战斗网页游戏《战斧OL》精美截图曝光),这是一款09年的基于Flash的网页ARPG,当时我们看到demo视频的时候以为是一款客户端(再次原谅我的浅薄,当时真的没有想到网页上可以做出来实时战斗游戏),当时的心情是:我靠,太cool了(=_=!),我们TMD还在搞什么鸟的SLG,技术太落后了!!!

<img src="https://pic2.zhimg.com/80b0a50bd677bbdd29a4db3ee435714d_b.jpg" data-rawwidth="957" data-rawheight="596" class="origin_image zh-lightbox-thumb" width="957" data-original="https://pic2.zhimg.com/80b0a50bd677bbdd29a4db3ee435714d_r.jpg">

2009年10月,《明朝时代》由于技术改进,引入了Ejabberd(erlang著名的开源聊天服务套件)作为游戏的聊天服务器,但是在使用过程中遇到了些技术问题,高潮来了:我们在不懂Erlang的情况下,尝试修改Ejabberd的源码,居然解决了我们的性能需求!当时我一方面佩服我当时的老大,一方面惊异于Erlang的神奇:要是C++端,有个10W行代码,你敢随便改吗?

2009年11月,ECUG在杭州召开,我们几个PHP都跑去膜拜各路大神,顺便请教一下他们在Erlang方面的看法。 期间结识了

@余锋

(不用介绍了吧) 立涛

@赵东炜

金尹 (这两位是《Erlang程序设计》的译者)

@许式伟

(许总当年还没有找到golang) 老范(erlbattle - 恶狼战役->基于Erlang语言的实时技术学习平台[Erl Base actual time technic learnning env.]) 侯明园、李杰、崔博、Python大妈(一开始没认出来)一大批牛人以及周爱民老师。云风当时路过了下,没有机会深入请教。

这次技术会议应该是我目前为止收货最大的一次,当时听了余老大的PPT基本一遍就记住了(不是懂了),后来请教了以上诸位牛人的建议(当然主要还是余老大给的信心),各位也坦言用Erlang必然会遇到些问题,但是说实话,哪门子语言对于我们来说不会遇到问题呢?因此考虑了如下几点之后,我们选择了Erlang作为服务端语言:
a. Erlang的入门真的很简单(有同学说不简单,那我没办法)
b. 不懂C++,Java呢又觉得臃肿
c. PHP当时有团队验证搞ARPG不太适合(c扩展方式我们也搞不定)
d. 网页游戏当时“唯快不破”【当时的市场决定的】
e. 热更新对于在测试、技术能力上偏弱的一帮人来说,吸引力太大
f. 1:1模型对于编程复杂度的降低有非常直接的帮助【呵呵,麻烦没有实践过的同学不要瞎批评好吗?有时真的不太懂,你都没有搞过,怎么就敢理直气壮】
g. 天生分布式【谁用谁知道】

-----
根据

@bhuztez

的指正,用M:N的说法的确更合适,1:1其实是粒度的不同产生的说法,例如一个玩家一个网络进程,就是1:1,但是一个玩家一个进程就不合适了,这个时候可能是1:N了。

八卦一:技术会议本身是开放的,大家有意见讨论是正常的;ECUG杭州期间,Erlang主题的时候(忘记是哪位的主题了),两位C++同学一开始是各自向演讲者提问的,后来两位直接争起来了;随着接触C++同学越来越多,发现C++同学较为容易鄙视其他C++同学的做法,总是认为自己的做法才是符合C++的精髓;结果呢,高手本来就少,还很容易有鄙视链。 这个也是我对C++感觉心累的原因之一(我C++没学好,就不去评论C++本身了)。

3. 10年,踩坑、填坑Erlang

2010.1.1 我们团队4个人没有放假,过来公司写代码,因为实在太兴奋了---对于没有写过ARPG的人来说,这实在太让人激动了!
我们参考了RabbitMQ的代码结构和网络部分把框架搭建起来了,基本上是三天左右,这期间还一边在看书;使用了google protobuff作为通讯协议,顺便修正了部分protobuff第三库的一些bug,花了一周多时间;然后陆续花了2、3周的时间去做了几个简单功能,创建角色、登陆、场景、组队、怪物、战斗,我们把这个游戏demo称为mgee(mingchao game engine of erlang version,哈哈,好掉渣的英语,当时以为自己能搞个引擎,其实是无知者无畏),至于流传到了多少地方应该没法统计了,有几个三本学校开Erlang课程用的就是mgee作为基础。

到了2010.2月X号,我忘记了,反正后天就是年30了,mgee作为demo已经完成了使命,我们压测了一下发现只有500的承载能力,这个促使我们去了解跟多的游戏架构知识。

2010.3月,春节回来,我们团队到处找人请假,当时征途团队的技术负责人过来一次过广州,但是比较可惜没能有机会当面请教;后来呢,在网上找到一些资料,讲的是征途、天龙、魔兽世界等游戏的架构(有些是作者猜的),附上一些图给大家看下我们当年看到的资料:

天龙服务端架构思路:
<img src="https://pic1.zhimg.com/d625f52305b9aeeba84ae0804d20f05c_b.jpg" data-rawwidth="1289" data-rawheight="851" class="origin_image zh-lightbox-thumb" width="1289" data-original="https://pic1.zhimg.com/d625f52305b9aeeba84ae0804d20f05c_r.jpg">bigworld:

bigworld:
<img src="https://pic1.zhimg.com/c02bd80b66a171de8eeecfd04963f958_b.jpg" data-rawwidth="456" data-rawheight="342" class="origin_image zh-lightbox-thumb" width="456" data-original="https://pic1.zhimg.com/c02bd80b66a171de8eeecfd04963f958_r.jpg">

QQ游戏大厅:
<img src="https://pic1.zhimg.com/669d4fb824478443d95416201c2d5218_b.jpg" data-rawwidth="705" data-rawheight="472" class="origin_image zh-lightbox-thumb" width="705" data-original="https://pic1.zhimg.com/669d4fb824478443d95416201c2d5218_r.jpg">

基于这样的资料和我们自己的经验,我们做了《明朝传奇》,在线最高到了3100。这期间我们搞明白了1:1该怎么用,mnesia该怎么用,哪些东西是Erlang可以搞得定的(除了怪物寻路,其他逻辑都是基于Erlang),最终明白了一个道理:用不用的好看你个人,语言的约束对群体有效,对个体不一定有效(类似统计与概率),我们从来不鼓吹别人去用Erlang(大家为什么用Erlang,我们只能算是开了头,不是鼓吹者),我们只是告诉你,用Erlang也可以用得好。

4. 2011-2012年,Erlang服务端框架简化

当时几个事情促使了我们再往前一步:
a. 明朝传奇的代码我们搞的太复杂,开发和运行效率都不够高,代码难以掌握
b. 当时光环的

@达达

来讨论如何一机多服,给我们带来了思路上的很大冲击:成本控制
c. 顶端的Erlang不好培养

基于上面的原因,我们希望新的erlang服务端框架有如下特征:
a. 简单、简单到发指,

@谢廷宝

当时大宝推荐了一种服务端设计的简单标准:有语言经验的人就能看得懂(并非100%掌握),也就是说看到API知道怎么写功能。 这里可能有人会吐槽了,你把框架搞的这么强,那些新人能学到什么? 呵呵,源码在内部是100%开放,每周都有内部分享来分析现有的实现的优缺点,每个人都可以在经过审查后修改核心实现,为什么会限制新人呢?总有些人讨论问题喜欢偷换概念,也喜欢指责别人自己做不到的事情。

b. 性能高,上面庞巍伟同学提到的2000在线是不对的,当时捷游的梦幻飞仙过了4700(不分线、回合);而我们的《仙落凡尘》则是不分线ARPG的情况下到了4300(4399 1服),就当时的CPU和内存使用情况来说,1/3的资源不到。(当时没有办法了,游戏地图设计的不够大,玩家进入游戏后实在太挤了)

在原则a的指导下,新人花三天看书、3天写点入门代码,1周的确是可以去写点简单的功能的。(在珠三角的同学欢迎当面来讨论验证)但是如果你要求1周就能多么熟悉、深入,这谁也做不到。

4. 2013-2015,Erlang在内部算是真正的落地

真要让一门技术变为解决方案,光靠坚持不够,我们在内部也做了一些事情来帮助Erlang在内部至少可以形成简单的生态群:
a. 成立虚拟的Erlang框架引擎组,负责在各个项目组之间同步优秀代码、统一基础框架、剥离业务抽象逻辑【由于这边的文化氛围,推进起来相对容易】
b. 剥离公用非游戏专用服务,例如mlog(通用日志服务)、mbd(通用大数据服务)、mchat(通用聊天监控服务)、mservice(通用托管服务),提供给各部门各项目使用

这样,配合少量开源库,基本上能够做到快速稳定高效,也不会那么容易遇到技术瓶颈,技术的应用方向也不会太狭隘。

5. 一点总结

a. 用了Erlang接近5年,越是深入越是觉得Erlang神奇,集中点还是Erlang的设计哲学,这里推荐一篇文章:  Erlang的调度原理(译文)来了解下。
b. 我从c/php/erlang一路走过来,算是对编译型、脚本、函数式语言有个比较横向的了解,推荐时间较宽裕的同学深入学学Erlang,不一样的哲学会极大的丰富你的世界观,影响你的方法论(好吧,看起来有点鸡汤了)
c. 像分布式、热更新等都是非常重要的基础设施,真正的高手自然不需要,但是你是否需要这些还是可以判断的(多数人并非天才)
d. 感谢

@余锋

这样的人一直在坚持,总有人会让你觉得感动,感动于他们的坚持、分享,世界并非非黑即白,而是多姿多彩。Erlang、C++、C、PHP、Scala都是一部分。
e. 你或者你们团队用不用Erlang,要看你或者你们团队的经验、产品需要、职业发展、成本等来综合考虑,并不是一句话能够说明的清楚的。而我只是想说一般来说,坚持能解决大部分问题,没有多少所谓的弯路,Erlang和C++等语言谁好谁坏也不是一句话能定论的。

6. 其他补充

a. 当年的游戏服务端demo:

qingliangcn/mgee · GitHubhttps://link.zhihu.com/?target=https%3A//github.com/qingliangcn/mgee

erlang游戏服务器相关推荐

  1. 浅谈erlang游戏服务器项目--英雄远征服务启动流程

    1.看代码结构我们知道启动脚本run.sh,看脚本中的-s sd server_start我们知道启动接口在sd.erl的server_start函数. 2.我们打开sd.erl找到server_st ...

  2. 英雄远征Erlang源码分析(3)-游戏服务器的启动

    上一篇文件介绍了网关服务器的启动,其功能主要用于给客户端返回可选的游戏服务器列表,让客户端去连接.其实有些游戏的网关部分使用的是PHP搭建,代码的维护和Erlang是分开的.现在让我们来看游戏服务器的 ...

  3. php 多人游戏_「谁会是下一个王者农药」云服务器如何搭建游戏服务器?

    手游越来越火了,听听业内人士的分析,他山之石,多多借鉴,那么手游的服务器到底如何搭建的? 从事游戏服务器开发差不多两年时间,两年间参与了不少项目,学到了很多游戏服务器开发技术,参与过几个不同架构的服务 ...

  4. go hive skynet_MMORPG游戏服务器技术选型参考-Go语言中文社区

    游戏服务器一般追求稳定和效率,所以偏向于保守,使用的技术手段也是以已经过验证.开发人员最熟悉.能HOLD为主要前提. 1.典型按场景分服设计 开发语言: c++ 数据库:mysql 架构: 多个网关: ...

  5. 分布式的客户端-服务器结构_MMORPG游戏服务器技术选型参考

    游戏服务器一般追求稳定和效率,所以偏向于保守,使用的技术手段也是以已经过验证.开发人员最熟悉.能HOLD为主要前提. 1.典型按场景分服设计 开发语言: c++ 数据库:mysql 架构:多个网关:维 ...

  6. 游戏服务器停机维护,网络游戏是如何做到服务器不停机维护的?

    [IT168 评论]游戏的定期更新版本已经再寻常不过了,但频繁的更新会造成流失率非常严重,哪个玩家也不希望再BOSS将要躺下那一刻,服务器停机维护了.在小版本更新过程中,采用不停机维护成为现在游戏的主 ...

  7. 游戏服务器停机维护,游戏是如何做到服务器不停机维护的?

    [IT168 评论]游戏的定期更新版本已经再寻常不过了,但频繁的更新会造成流失率非常严重,哪个玩家也不希望再 BOSS 将要躺下那一刻,服务器停机维护了.在小版本更新过程中,采用不停机维护成为现在游戏 ...

  8. 游戏获取服务器信息,易语言获取游戏服务器信息

    易语言获取游戏服务器信息 内容精选 换一换 使用Touch对终端进行配置前需要先将Touch接入终端,接入方式包括TOUCH口连接.交换机网口连接和Wi-Fi连接.TOUCH口连接将Touch接入终端 ...

  9. 谈谈一只菜鸟转行Erlang游戏服务端的经历(希望大佬指导,也希望我的经历能给一些还未毕业的同学或者正在迷茫自己工作内容的同学一些感触)

    入行半年Erlang游戏服务端的心得体验 个人经历 转方向后的工作经历 工作中遇到的问题和处理 一些游戏服务端开发的体验和想法 最后谈谈自己现在面临的问题 第一次发文章,主要想谈谈自己近半年来的心路历 ...

最新文章

  1. Jackson 框架使用教程,轻易转换JSON
  2. 任务队列和异步接口的正确打开方式(.NET Core版本)
  3. 三十二楼层选几层最好_32层的房子买几楼好
  4. C#三层架构第四课之DAL层
  5. Git 图形化操作之合并提交记录
  6. 【FFMPEG源码终极解析】void av_packet_unref(AVPacket *pkt)
  7. python股票预测代码_python用线性回归预测股票价格的实现代码
  8. 如何用 200 行 JavaScript 代码实现人脸检测?
  9. typedef 定义数组类型_Java基础之数组
  10. windows下安装MinGW、swig 、zlib
  11. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_02-freemarker介绍
  12. 测试驱动开发(TDD)的理论基础
  13. 镁光硬盘测试软件,镁光固态硬盘评测
  14. b区计算机考研招不满的大学,b区考研招不满的大学 适合调剂的学校有哪些
  15. PHP 链接手机短信接口
  16. HOJ 2706 Key Task
  17. 拼多多免费版 自动回复 关键词回复 提高3分钟回复率
  18. 微信小程序播放m3u8视频总结
  19. 【数据结构】广义表的存储结构及基本运算(C语言)
  20. 锁相环设计与MATLAB仿真

热门文章

  1. 快手的视频 发到抖音 怎么消重 视频md5值查询
  2. 按键精灵——欲望驱使之下的碧蓝航线12-4练级脚本
  3. 电脑如何分区重装系统
  4. 数学笔记27——极坐标下的面积
  5. 一对同居男女同一天的日记
  6. ChatGPT教程之 01 什么是ChatGPT革命性的对话生成新工具
  7. oracle 的乘法,Oracle group by 相乘
  8. 国标GB28181摄像头直播视频流媒体服务器获取视频流失败问题分析
  9. Win 10上帝模式 的开启和高级隐藏文件
  10. (OJ)Java多线程-子弹射击