<dl id="wqg5j"></dl>

    1. <menuitem id="wqg5j"></menuitem>

      <dl id="wqg5j"><font id="wqg5j"></font></dl>
    2. <dl id="wqg5j"><ins id="wqg5j"></ins></dl>
    3. <dl id="wqg5j"><ins id="wqg5j"><thead id="wqg5j"></thead></ins></dl>
      <li id="wqg5j"><ins id="wqg5j"></ins></li>
      安基网 首页 编程 软件学院 查看内容

      为何游戏服务端用 C++ 来写£¬是历史原因还是性能方面的考虑£¿

      2018-10-9 02:04| 投稿: xiaotiger |来自: 互联网


      免责声明£º本站系公益性非盈利IT技术普及网£¬本文由投稿者转载自互联网的公开文章£¬文末均已注明出处£¬其内容和?#35745;?#29256;权归原网站或作者所有£¬文中所述不代表本站观点£¬若有无意侵权或转载不当之处请从网站右下角联系我们处理£¬谢谢合作£¡

      摘要: 游戏也分不同领域£¬不同的游戏之间业务逻辑和适用架构区别很大£¬并不能一概而论¡£比如对于大部分手游¡¢页游来说£¬追求短平快的开发节奏也不要求太高的实时性和计算效率£¬C++在这些领域的使用属于杀鸡用牛刀¡£国内这 ...

      游戏也分不同领域£¬不同的游戏之间业务逻辑和适用架构区别很大£¬并不能一概而论¡£

      比如对于大部分手游¡¢页游来说£¬追求短平快的开发节奏也不要求太高的实时性和计算效率£¬C++在这些领域的使用属于杀鸡用牛刀¡£国内这些领域还采用 C++ 的团队£¬要么是技术决策者?#21491;?#29421;窄£»要么是大厂成熟团队已有完善的遗留技术栈¡¢工具链和人才储备£¬迁移到其他语言的收益相对不高£¬或是怕担转型决策风险等等£»再有就是从大厂出去创业顺走了技术框架或迷信大厂经验的团队?#21462;?/p>

      题主特别提到 MMORPG £¬此处就 MMORPG 这一领域为何普遍使用 C++ 进行简单讨论¡£

      MMORPG主要是指在地图上实时战斗一类£¨比如 WOW¡¢传奇等£©£¬不包括回合制 MMORPG £¨神仙道¡¢梦?#26790;?#28216;等£©¡£

      常见 MMORPG 服务器在技术层面的特性需求£º

      • 网络IO密集¡£高频率的?#21491;?#21516;步消息£¨一般在 10-60Hz 之间£©£¬与玩家数量的关系是 O(n^2) 的复杂度£¬对于一些侧重国战等玩法的 MMORPG 尤其压力山大¡£通常都需要配合相关?#21491;?#31649;理算法来减少消息发包数量£¬甚至需要配合架构做广播的负载分流¡£
      • CPU密集¡£MMORPG 的玩法规则都需要服务器做权威性的计算£¬简单些的也需要大量怪物的 AI 和寻路计算£¬以及实时战斗的逻辑和技能运算等等£»一些先进的 3D MMORPG 服务器甚至整合了物理引擎£¬来做碰撞检测和校验¡£
      • 实时性¡£此类游戏侧重实时战斗和交互体验£¬能容忍的响应延迟通常在 200ms 以内£¬即使可以通过?#31361;?#31471;预演算进?#35874;?#21644;¡£考虑到网络延迟这个不能通过语言和架构来解决的要素£¬两次游戏逻辑更新发包的间隔最好控制在几十毫秒这一?#32771;¶¡££?#25152;以一些 GC 不太注重实时性的语言£¬可能会有潜在的负面体验影响£©¡£
      • 稳定性和容灾¡£常 Crash 的服务器£¬轻则影响玩家体验£¬重则导致公司倒闭¡£
      • 开发效率¡£这个方面除了受语言特性本身影响£¬还需要考?#31185;?#23427;要素£¬比如生态圈丰富程度£¨需要的功能可以容易?#19994;?#31283;定好用的库£©¡¢周边工具链完善程?#21462;?#20154;员补充难易程度£¨是否是学校培训的主力语言¡¢是否是领域比较主流的语言£¬或者是否足够简单好培训£©¡¢现有遗留人力和技术资源的价值等?#21462;?/li>

      C++ 和其它候选语言的比较

      C++£º

      • 网络 IO£º历史上这方面曾经是考量的主要因素£¬近年来?#36127;?#25152;有主流后端语言都封装有高效的网络 IO 库£¬C++ 已不具备独特优势¡£
      • CPU 利用率£ºC++ 在这方面的优势不需要讨论了吧...
      • 实时性£º无 GC£¬内存分配延迟可控£¨内存池¡¢预分配等£©£¬毫秒级延迟需求的高?#21040;?#26131;都在用¡£
      • 稳定性和容灾£º用 C++ 写出长期稳定运行的服务器程序£¬对开发团队而言是件要求比较高的?#34385;é£?#23588;其在逻辑复杂又变更频繁的前提下¡£语言本身也不保证内存访问的安全性£¬如果有内存写越界导致的 Crash 也很?#35759;?#20301;¡£国内某大厂采用了分离数据和逻辑进程£¬通过进程间共享内存来通信的方式£¬来实现逻辑进程崩溃重启不丢失数据¡£?#36824;?#36825;种做法有一定门槛£¬存在性能开销£¬而且对开发效率和灵活性也有比较大的约束£¬也不易整?#31995;?#19977;方库£¬不能算是通用的最佳实践¡£
      • 开发效率£º如果有良好的内力和 C++ 编程素养£¬并?#36951;?#21512;现代 C++ 的一些语法£¨auto¡¢lambda¡¢智能指针等£©£¬开发效率尚可算是勉?#32771;案ñ£?#20294;相对以下讨论的其他语言来说仍处于劣势£¬然而达到上述水准的人力资源?#26432;?#21364;要比其它语言要高出不少£¨人员补充速?#21462;?#22521;训周期和薪资£©¡£综合而言£¬这方面可算 C++ 的一大短板¡£

      那么£¬假设不采用混合语言的方案£¨C++ 配合 Lua 或 Python£¬或者多服架构不同服务器用不通语言 等£©£¬除了 C++ 之外还有哪些语言值得考虑£¿

      考虑到 MMORPG 在 CPU 计算方面的压力£¬解释型语言暂且可以排除¡£

      目前考察过的备选方案£¬主要有 Java¡¢C#¡¢Go¡¢Rust¡£

      Java£º

      优点£º

      • 生态圈成熟£¬库丰富¡£
      • Netty 网络库性能强悍¡£
      • 不爽语法还可以用 scala 和 kotlin...

      缺点£º

      • 除了原始类型外£¬不支持自定义值类型¡£而且泛型是以类型擦除的方式实现¡£这样的特性导致了£º1.难以把数据连续紧凑地进行表示来优化算法的缓存命中率£¬比如2D地图的每个格子坐标都是个object£¬寻路算法呵呵¡£3D 场景的碰撞体每个顶点都是个object£¬物理引擎呵呵¡£2.对原本对实时性不甚友好的 GC 造成了更大压力¡£
      • 成熟的 JVM 实现并不怎么侧重 GC 的实时性¡£如果触发了百毫秒以上的世界冻结 GC 延迟£¬所?#24615;?#32447;玩家都会受到影响¡£
      • JIT 在预热不足的情况下£¬?#32423;?#20250;导致性能曲线不平滑£¬引入预料之外的响应延迟¡£

      C#£º

      优点£º

      • 开发友好£¬语法糖甜¡£
      • 有真正的泛型和值类型¡£特定算法好优化¡£

      缺点£º

      • 微软家的¡£微软家的¡£微软家的¡£跑在 Windows Server 下没什么问题£¬然而抛开授权费不谈£¬大部分主流的开源?#26790;?#37117;是优先考虑 Unix / Linux£¬比如 Redis£¨长期没有 Windows 版本的官方支持£©¡¢MongoDB£¨Windows 下性能要弱于 Linux 下£©£¬而且 Windows Server 的网络性能也要弱一些¡£除非解决方案都用微软全家桶£¬不然部署和运维就需要同时维护两个平台...至于 Mono£¬跟 JVM 比起来就像玩具¡£只能期待 Rosalyn 成熟了¡££¨目前项目正在用 .Net Core£¬实现游戏逻辑跑在Linux下问题不大£¬一些跟操作系统联系比较紧密的底层功能还是用了C++£©
      • GC 实时性类似 Java¡£

      Go£º

      优点£º

      • 语法简单易掌握¡£
      • 开发体验友好¡£
      • 有值类型¡£
      • 新版本的 Go£¬GC 实时性良好£¨1.8 号称 STW 控制在 1ms 以内£©¡£

      缺点£º

      • 没有范型£¬某些地方需要转?#32479;?interface{}£¬?#36824;?#32534;译器会做?#21491;?#20998;析£¬不必要的地方不会自动 boxing£¬影响不算太严重¡£

      Rust£º

      优点£º

      • 运行效率比肩 C++¡£
      • 语言特性优秀¡£
      • 编译期保证了内存安全£¬没有 GC 开销¡£
      • 编译期保证线程安全£¬可以放心大胆地并发£¬容易写出高效的多线程代码£¨?#36824;?#27515;锁是需要自己避免的£©¡£

      缺点£º

      • 上手曲线较陡¡£
      • 太年轻£¬生态圈尚未成熟¡£
      • 较小众£¬人员补充困?#36873;?/li>

      大部分 MMORPG 主要采用 C++ 并不是没有原因 £¬虽然历史原因的比重不小¡£然而如果要在什么都没有的情况下£¬从零开始开发 MMORPG 服务器£¬采用 C++ 并无必要¡£抛开人才储备的方面不谈£¬Go 算是目前开发 MMORPG 服务器各方面特性都比较匹配的选择?#20309;?#35770;开发效率还是运行效率£¬以及工具和人员培训速度等?#21462;?#22914;果是技术导向的团队£¬可以试试 Rust¡£C# 和 Java 也是不错的选择£¬虽然有些特性不是很好满足£¬但也足够支撑一款游戏成功了£¨如果不追求提供极致的平滑体验的话£©¡£

      至于 C++£¬在具备一些前提条件的情况下可以考虑采用£º已有成熟 C++ MMORPG 代码框架£»已有 C++ 写得 666 的技术团队£»不差钱也不赶进度£¬就要质量稍高一些的流畅体验£»需要整合一些 C++ 库?#21462;£²还?#21363;使如此£¬C++ 也推荐搭配其它语言使用£¨比如早几年常见搭配 Lua£¬主要用来提高迭代速度和开发效率£¬并且一定程度上可以支持热更£©¡£

      目前?#36127;?#27809;?#20889;看?#30340; C/C++开发游戏服务端的¡£

      早年开发游戏必须用C++£¬这没得说£¬2000-2004年£¬java还没有nio£¬其他动态语言不抗重负£¬只能C/C++能开发出完整可用的游戏服务端¡£直到2005年£¬韩国的游戏很多都还是纯C++写服务端£¬金山之前也开发过很多?#30475;âC++的游戏服务端£¬后来大家都切了¡£

      现代选择有很多£ºjava + javascript, c+python, c+lua, scala, go, erlang¡£面向性能的服务器用 java£¬面向逻辑服务器 python£¬面向高并发的会选择 scala£¬次一级高并发或者性能测试程序£¨机器人£©会选择 gevent¡£那是不是就不用C++呢£¿用 C来做网络£¬不用C++£¬但是C的比例在所?#20889;?#30721;中占比有限¡£

      这是否意味可以放弃C/C++了£¿也不是£ºC语言是一把锋利的匕首£¬而现代动态语言是一把长剑¡£平时匕首可以藏在身上£¬大部分时候用长剑披荆?#37117;?#23601;够了£¬但当碰到坚硬的石头£¬长剑?#36824;?#29992;了£¬那么拿出匕首来果断的切碎他¡£

      对于一个成熟领域而言£¬建议是尽量用更高级一点的开发语言£¬因为游戏开发很多核心技术都有了较为妥当的解决方法¡£大量的服务端逻辑其实都是在等待£¬等待网络£¬等待数据库£¬这种情况下用C得不偿失¡£但是服务端有一些地方还是躲不开C/C++£¬比如当服务器涉及到 3D计算的话£¨国内很多2D服务端£¬国外很多3D服务端£©£¬大量的矢量矩阵£¬除了用C++封装出一套好用的数学库外£¬即便直接用java写£¬那也是很麻烦的¡£再比如现在快速动作越来越多£¬为了让玩?#20063;?#20316;更流畅£¬需要基于 UDP快速可靠协议£¬协议开发用 java或者scala£¬性能上是没办法满足要求的£¬况且协议实现后要和?#31361;?#31471;通?#29275;?#27809;法让所有?#31361;?#31471;跟着一起用java/scala¡£再比如某些cpu密集的抽象度高的模块£¬如 aoi或者 ai模块¡£

      对于一个新兴领域而言£¬C/C++很多情况下是别无选择的东西¡£比如移动化?#39034;备?#36215;步的时候£¬还没有啥 cocos或者 unity真要开发游戏£¬必须迅速的使用起 OpenGL ES和 OpenSL£¬然后再叠加某一脚本£¬以快制胜£¬第一批移动?#39034;±É戏?#36130;的就是这些游戏¡£又或者£¬可以根本躲开£¬先不介入£¬等到几年后cocos和 unity成熟了£¬在介入用lua / C#写程序¡£再比如服务端如果离开熟悉的游戏和web£¬去开发一个陌生的领域£¬如流媒体服务£¬会发现这怎么和10年前的游戏一样?#21073;?#20160;么高级工具都不给用用£¬这时可以再等个四五年应该高级工具会出现£¬异或想领先别人时£¬就果断的拿出 C/C++来解决之£¬这就是C独有的开拓新领域能力¡£

      大部分答案都是非黑?#31383;×£?#38750;此即彼¡£不要只会C不会动态语言£¬避免成为一个?#24403;Æ£?#20063;不要只会动态语言不会C£¬避免离开熟悉的?#29575;Ò¾突?#19981;下去¡£对于一个新手而言£¬如果什么都没学过£¬建议是先用快速开发的东西£¬把项目弄起来再说£¬有精力有机会的情况下£¬也不能完全放弃一些基础的东西£¬让自己残缺了¡£

      PS£º在相同架构下£¬就?#30475;?#24615;能而言£¬各种语言性能差距到底是多少呢£¿如果只开发回合制这些慢节奏游戏£¬或者HTTP接口£¬大部分情况都在等待数据库等待用户消息的话£¬差别确实不大£¬的确可能5%都不到¡£如果cpu密集了£¬那么可以参考下面的图表£¬总体来说是10-50倍的性能差别£º

      有人问£¬说了半天£¬这个也不行£¬那个也不完?#28291;?#32780;时间有限£¬有没有一个更经济实惠的方法?#21073;?#22914;何才一次性达到彼岸?#21073;?#26102;间有限项目?#36234;?#26377;没有更好的选择£¿说有£¡那就是 java¡£国内游戏开发绕来绕去还是脚本+C+erlang+go£¬?#35757;来?#23478;就不会其他东西了么£¿大部分可以的情况下£¬除了非用C/C++£¬推荐各位?#38505;?#32771;虑下 java£¬这个性能上最接近C的东西£¬能承当大部分cpu密集型事务£¬?#20174;?#19981;会象c那样 crash了找都?#20063;?#21040;问题在哪里¡£同时面向高并发时基于原生jvm的 scala可以提供类似 erlang的简单方式£¬函数式编程 & 大规模并发协程 & actor£»同时 java可以很方便的同 javascript结合£¬js的速度应该是动态语言里面最快的吧¡£再者 java还有 groovy£¬可以提供 python/ruby的泛型编程£¬用超高的开发效率和 python/ruby媲?#28291;?#21516;时还能和 scala 结合实现高并发¡£最重要的是写 java好招聘£¬到处都是写 java的工程师£¬大部分语言级的培?#20992;?#21487;以省略了¡£

      国内游戏开发者很多拒绝学习 java£¬因为很多开发者自己是碰都没碰过¡£现在拒绝 java的人£¬大部分只是在游戏圈子里面打转的人£¬?#32423;?#24320;发下 web£¬缺乏其他行业和领域的经验¡£看看除游戏外£¬当今多少世界级的开源服务器是用 java开发的£¿游戏就真有那么特殊么£¿看不是£¬国外大把java开发的游戏服务端£¬各位如果知道游戏服务端领域有啥 java技术栈解决不了的?#34385;é£?#40635;烦告诉一声¡£再看看java上下游的 scala, javascript, groovy这些东西¡£所以建议各位£¬有空有条件的情况下£¬?#38505;?#32771;虑下 java技术栈£¬世界很大£¬不是只有游戏£»即便游戏£¬现在的开发方法真的对吗£¿


      Tag标签:

      小编推荐£º欲学习电脑技术¡¢系统维护¡¢网络管理¡¢编程开发和安全攻防等高端IT技术£¬请 点击这里 注册账?#29275;?#20844;开课频道价值万元IT培训教程免费学£¬让您少走弯路¡¢事半功倍£¬好工作升职?#26377;剑?/font>

      本文出自£ºhttps://www.toutiao.com/a6609875045038686728/

      免责声明£º本站系公益性非盈利IT技术普及网£¬本文由投稿者转载自互联网的公开文章£¬文末均已注明出处£¬其内容和?#35745;?#29256;权归原网站或作者所有£¬文中所述不代表本站观点£¬若有无意侵权或转载不当之处请从网站右下角联系我们处理£¬谢谢合作£¡


      鲜花

      握手

      雷人

      路过

      鸡蛋

      相关阅读

      最新评论

       最新
      返回顶部
      Ðþ»úͼ
      <dl id="wqg5j"></dl>

        1. <menuitem id="wqg5j"></menuitem>

          <dl id="wqg5j"><font id="wqg5j"></font></dl>
        2. <dl id="wqg5j"><ins id="wqg5j"></ins></dl>
        3. <dl id="wqg5j"><ins id="wqg5j"><thead id="wqg5j"></thead></ins></dl>
          <li id="wqg5j"><ins id="wqg5j"></ins></li>
          <dl id="wqg5j"></dl>

            1. <menuitem id="wqg5j"></menuitem>

              <dl id="wqg5j"><font id="wqg5j"></font></dl>
            2. <dl id="wqg5j"><ins id="wqg5j"></ins></dl>
            3. <dl id="wqg5j"><ins id="wqg5j"><thead id="wqg5j"></thead></ins></dl>
              <li id="wqg5j"><ins id="wqg5j"></ins></li>