为什么我们仍然坚持用C++做游戏服务器

本文涉及的产品
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
可观测监控 Prometheus 版,每月50GB免费额度
简介: 为什么我们仍然坚持用C++做游戏服务器

       本篇文章纯属文字,不需要配图。

       首先以我个人观点来说,C ++对于我的吸引力不仅仅是它的技术优点。c++是个庞大而奇怪的语言,很多新领域会选择这个语言是因为有性能上的需求,但是又拿不准瓶颈会出在哪里,C++是一个什么地方调优都很方便的语言,内存,CPU,线程优先级,IO等等,这些资源的使用交给你来掌控。

       我以前经常噎那些喜欢过度优化的人说“你怎么不写汇编呢”,直到上个月,给程序调优的时候发现一个compare函数平均每秒会被调用500W次,我不得内联了一个汇编来优化它。虽然不是什么地方都需要面向性能编程的,但是发现瓶颈之后能不能方便的解决掉,是一个非常重要的问题,曾几何时,我们在写服务器框架和排行榜逻辑,游戏玩家匹配,战斗同步等问题常常会遇到内存问题,CPU计算上的性能瓶颈,这就需要重新思考如何去优化,通过修改代码逻辑,内存使用方式上...

关于C++开发效率:

       之前大多数人一直吐槽C++开发效率慢,不过经过近几年发展,c++开发效率也不算低,虽然对新人依然不怎么友好,但是从技术选型的角度来看依然是很多领域的不二之选。我不是让大家摒弃其它语言。实际上我在淘米网的时候,参与过摩尔庄园1的技术都知道online服务器是用C写的,面向过程的写法和思路,你看的脑壳疼,直到后来在赛尔号,小花仙,功夫派,奥特曼等项目中用C++重构了主要的逻辑和底层库, 后边的项目迭代开发,新立项的产品也很快得到验证。

     大概三四年前我觉得boost::function这种东西好重啊,可是这两年c++11,C++17开始普及,我立刻转投c++11的怀抱,多一层封装什么的在编译器优化面前不值一提。(题外话,我想起了N年前,我一大学同学在巨人网络的征途项目,他们那段时间在做一件事情,就是让项目支持C++11,因为项目太庞大,编译报错让你崩溃到不知道要修改到什么时候,做了不到两个月就放弃了,)这几年的c++开始变得越来越好用,开发效率也完全不是问题

C++血泪史:

       当然C++也不是带着所有的光环,新手,甚至是老司机也非常头疼的就是C++的崩溃宕机,造成崩溃宕机的原因很多,对CPU使用不当,尤其是对内存的使用不当,造成越界访问,空指针访问,非法写入,野指针,double free,栈溢出,内存碎片过多造成内存申请失败等等问题。

       在我所经历过的游戏项目中,加班时间里几乎有一半的都是在修bug,甚至通宵修BUG,最最痛苦的莫过于《忍者Q传》项目中的野指针问题,每到周五十二点左右准时宕机,折腾了一个多月,core的堆栈已经被破坏了,每次core 的堆栈不一样,头皮发麻,只是知道哪里有野指针了,于是通过宕机前后可能发生的游戏活动联系到可能是因为公会战结束后释放资源的一些逻辑触发导致的,后来还用valgrind在线上跑(我的心也真够大的,因为你要知道valgrind对资源的使用非常厉害,会卡到你哭,线上玩家的操作会存在延迟卡顿),后来锁定是在释放资源的时候造成的野指针问题,在没有解决宕机问题之前,每个周五,不,每天都是地狱image.gif编辑,你觉得在这一个月应该掉多少头发合适?

        相信很多从刚入职场的小白到大佬都会有各种各样的感同身受,当然,回到我们之前的Platform Computing(现已被IBM收购,实际上我更认为自己是Platformer),这里看到了敬仰的大神 "左耳朵耗子" 陈皓,也有一段之前的趣事,David Bigali差点让他做测试,别写代码了:

image.gif编辑

       当然,现在仍然会为内存问题而头大,以后也会的,但这不影响我对C++的喜爱,不影响大厂对C++的喜爱,毕竟这个问题他总归是可以收敛解决的。

为什么还是有很多大厂使用C++:

       回归正题,目前游戏服务器开发技术已经百花齐放了,jvm系,node.js, Erlang,go,Python都有, 用node.js,java,python不香吗?我所知道或者经历的腾讯系(包含从腾讯出来创业的大多数游戏公司),搜狐畅游,网易,巨人网络,苏州蜗牛,盛大,九城,完美世界,游族等游戏公司都使用C++,而且都有非常丰富的技术积累和沉淀。

       那么仍在坚持C++的原因是啥呢?我觉得有两点:

1. 历史积淀和闭源思维。十多年前,技术栈,包含编程语言的选择还不是很多。C++是当时看来少数,被证明稳定,可靠,高性能,具备丰富功能的高级语言。所以首当其冲,被选择作为开发主力。基于此,进程框架,诸如线程模型,定时器,容器等;IPC,比如socket,共享内存,并由共享内存进一步衍生出的数据恢复技术等都蓬勃发展。而且大厂之前都有封闭的思想,这和现在开源流行完全不同。生怕别人知道自己的技术优势,也非常不信任社区产品的质量。结果就是——造轮子,各种造。从数据库,到序列化工具,从xml解析器到负载均衡组件,凡是游戏开发碰到的,全部自己造,而且都拿C++造。

2. 游戏存在高性能需求场景。目前无可替代。别的不说,一个简单的帧同步,每秒30/60帧,多人数据同步。现在我们用c++也只能支持单机小几千,大概就是每秒十多万个包吧。所以没有很强的信心换成别的语言。因为成本已经是这样了,为何要在机器成本没法明显优化的情况下,再去增加技术风险和迁移成本?在一些卡牌类型游戏中,后端也存在大量的数值密集型计算。虽然在架构上可以分布式,可以扩展,但降低机器成本同样非常重要。特别是对在线规模很大的游戏而言尤其重要,因为即使能优化10%,背后的机器数量恐怕也不是一个可以忽略的数目。

说了这些,只是介绍现在的成因。但总体上,随着技术的发展,百花齐放应该是大趋势。选择合适的语言,在合适的场景,做合适的事情,这是大家逐渐认同的。而且很多尝试都在解耦,从库依赖变成服务间通信,这样更有助于不同语言共生。现在基本形成,高性能c/c++,灵活逻辑脚本化,运维工具Python,大数据用spark,日志流用elk。

       对开发人员而言,语言的要求慢慢从一招鲜变成了一专多能,比如我之前参与开发的忍者Q传,战争学院,基本山都是C++和Lua,php多种语言开发完成,还有海外madfinger,gameshop的开发项目都是以js和php为主。唯一不变的是,业务需求永远在变,解决问题的技术就是好的技术。

       那么,你所接触过的游戏服务器开发中,用过哪些语言呢?

相关文章
|
7月前
|
Linux C++
C++服务器开发之定时器设计方案
定时器应⽤:1.⼼跳检测 2.技能冷却 3.武器冷却 4.倒计时 5.其它需要使⽤超时机制的功能
102 0
C++服务器开发之定时器设计方案
|
7月前
|
编解码 Linux C语言
探索C++与Live555实现RTSP服务器的艺术(一)
探索C++与Live555实现RTSP服务器的艺术
551 1
|
7月前
|
存储 应用服务中间件 数据库
C++文件服务器项目—Nginx+FastDFS插件—5
C++文件服务器项目—Nginx+FastDFS插件—5
90 0
|
2月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
280 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
2月前
|
存储 监控 NoSQL
Redis的实现二: c、c++的网络通信编程技术,让服务器处理多个client
本文讨论了在C/C++中实现服务器处理多个客户端的技术,重点介绍了事件循环和非阻塞IO的概念,以及如何在Linux上使用epoll来高效地监控和管理多个文件描述符。
29 0
|
7月前
|
编解码 C++ 流计算
探索C++与Live555实现RTSP服务器的艺术(三)
探索C++与Live555实现RTSP服务器的艺术
235 1
|
7月前
|
存储 编解码 算法
探索C++与Live555实现RTSP服务器的艺术(二)
探索C++与Live555实现RTSP服务器的艺术
280 1
|
7月前
|
存储 前端开发 数据处理
c++游戏服务器开发
c++游戏服务器开发
|
7月前
|
JSON API 数据库
C++文件服务器项目—数据库表设计 与 后端接口设计—6(三)
C++文件服务器项目—数据库表设计 与 后端接口设计—6(三)
106 0
|
7月前
|
应用服务中间件 开发工具 nginx
C++文件服务器项目—FastCGI—4(三)
C++文件服务器项目—FastCGI—4(三)
56 0