![]() 游戏也分不同领域,不同的游戏之间业务逻辑和适用架构区别很大,并不能一概而论。 比如对于大部分手游、页游来说,追求短平快的开发节奏也不要求太高的实时性和计算效率,C++在这些领域的使用属于杀鸡用牛刀。国内这些领域还采用 C++ 的团队,要么是技术决策者视野狭窄;要么是大厂成熟团队已有完善的遗留技术栈、工具链和人才储备,迁移到其他语言的收益相对不高,或是怕担转型决策风险等等;再有就是从大厂出去创业顺走了技术框架或迷信大厂经验的团队等。 题主特别提到 MMORPG ,此处就 MMORPG 这一领域为何普遍使用 C++ 进行简单讨论。 MMORPG主要是指在地图上实时战斗一类(比如 WOW、传奇等),不包括回合制 MMORPG (神仙道、梦幻西游等)。 ![]() 常见 MMORPG 服务器在技术层面的特性需求:
![]() C++ 和其它候选语言的比较 C++:
那么,假设不采用混合语言的方案(C++ 配合 Lua 或 Python,或者多服架构不同服务器用不通语言 等),除了 C++ 之外还有哪些语言值得考虑? 考虑到 MMORPG 在 CPU 计算方面的压力,解释型语言暂且可以排除。 目前考察过的备选方案,主要有 Java、C#、Go、Rust。 ![]() Java: 优点:
缺点:
C#: 优点:
缺点:
![]() Go: 优点:
缺点:
Rust: 优点:
缺点:
![]() 大部分 MMORPG 主要采用 C++ 并不是没有原因 ,虽然历史原因的比重不小。然而如果要在什么都没有的情况下,从零开始开发 MMORPG 服务器,采用 C++ 并无必要。抛开人才储备的方面不谈,Go 算是目前开发 MMORPG 服务器各方面特性都比较匹配的选择:无论开发效率还是运行效率,以及工具和人员培训速度等等。如果是技术导向的团队,可以试试 Rust。C# 和 Java 也是不错的选择,虽然有些特性不是很好满足,但也足够支撑一款游戏成功了(如果不追求提供极致的平滑体验的话)。 至于 C++,在具备一些前提条件的情况下可以考虑采用:已有成熟 C++ MMORPG 代码框架;已有 C++ 写得 666 的技术团队;不差钱也不赶进度,就要质量稍高一些的流畅体验;需要整合一些 C++ 库等。不过即使如此,C++ 也推荐搭配其它语言使用(比如早几年常见搭配 Lua,主要用来提高迭代速度和开发效率,并且一定程度上可以支持热更)。 ![]() 目前几乎没有纯粹的 C/C++开发游戏服务端的。 早年开发游戏必须用C++,这没得说,2000-2004年,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技术栈,世界很大,不是只有游戏;即便游戏,现在的开发方法真的对吗? ![]() |
| 本文出处: https://www.toutiao.com/a6609875045038686728/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|