闲话目前游戏服务器的开发

       我是从12年开始进入页游行业,接触到的第一个游戏项目就是淘米网的《摩尔庄园》,公司那个时候也刚在美纽交所上市,被Benson,魏震和Rock腾讯三巨头的感染下,做着喜欢的游戏... (后来在工作中我经常会遇到过不少00后的同事碰到我说,jack,我就是玩着你们之前做的 摩尔庄园和赛尔号长大的,巴拉巴拉...惭愧,是我老了还是你们长得太快了。。。)后来去其他团队转手游,但无论怎么转,做了这么多年的服务器开发,服务器开发的主要代码仍然是C++,除了历史原因之外,性能问题是大头。

        基本上游戏的整个开发从立项到上限,服务器都在考虑如何降低内存占用,防止内存耗尽;服务器在考虑提高稳定性和单服支持的最大人数。用脚本语言有一个很BUG的问题,调试难不可控。很少有策划会注意性能问题,最终很容易导致各种卡。这个也难怪他们,他们的重点在游戏逻辑上,不是那么关注技术方面。不过我知道C#,Java,Lua之类的垃圾回收机制在回收内存时很容易导致卡。

海外开发者的服务器端开发

        我曾经有过和海外开发者打交道的机会,曾经接触过 铁皮工作室, Games Workshop,MadFinger Games等知名工作室的开发者,他们很聪明的避开了C++这种笨重的语言,铁皮的《王国》系列产品(应该是3之前)的都是flash开发,Games WorkShop的《战锤40K》等作品的服务器是js(应该是他们的很多游戏项目都是在GameSparks平台上开发的,毕竟GameSparks上提供了丰富的SDK,可以让开发者只关注自己的业务逻辑,不用关心网络底层库,数据库,多线程,缓存),我接触过MadFinger Games的Unkilled产品的开发,他们使用主要是java,使用的是谷歌的GAE平台,做成服务直接发布。(如果读者感兴趣的,可以在后台或者文章末尾留言,我们可以交流下你感兴趣的海外开发者的一些技术,他们的框架平台选型

国内游戏大厂为何仍然使用C++

        其实用C++用的多是国内端游界的常态。在国内的页游手游小团队Hold不住。

分析原因可能是有以下几个方面吧。
1.从历史原因来说,早期国内游戏研发大公司基本都是用C++写的游戏引擎。可能原因是因为当时可能并没有专业的服务器端程序员,很多程序员都是客户端服务器端两手一起抓。而写客户端基本上就是C++的天下了。所以用同一种语言比较顺手,也不需要重新招聘,就直接用C++来写服务器了。其次可能是当时Java确实也不成熟,在业内没有一个有说服力的案例。.net就更加了。端游行业又是一个很看重成功案例的行业,前一个项目用C++效果不错,可能后一个就继续了。而且当时那一帮人出来创业的话,一定也会用自己熟悉的方案,所以C++就一直流传下来了。
2.从技术原因来看,C++确实是一个写服务器的好语言。

  1. 上限高

  2. 掌握核心技术

  3. 生态和其他

上限高,也就是性能极致。大公司一般不会采用上限低的技术,3A产品都是各种极致的集成,比如WOW这种规模的产品。什么开发成本,开发难度等,对于他们都不是大问题,反而因为上限低导致关键功能实现不了,这个才是硬伤。能堆人解决的都不是事,就怕堆人也解决不了,比如硬件限制。想想之前那些连STL,虚函数都不让你用的这种场景发生在多少大公司中你就明白了。

掌握核心技术。大公司不可能让自己的核心技术被别人控制。想想华为为什么研发鸿蒙系统。所以大公司造轮子都是常态。即便UE开放源代码,大公司都会继续研发自己的引擎,没有任何选择,钱都不是问题。核心技术基本都是基础设施,C++是大头。 

        所以基于这3点,大公司是不可能用其他技术作为核心工具的,C#,Java和Go败在性能,Rust败在生态。

很多时候,游戏服务器的瓶颈通常不是在cpu,也不是在io,而是在内存。游戏不同于网站服务器,游戏在线玩家数据都会放在内存,数据库只是作为一个数据持久化的存在。所以限制游戏服务器同时在线人数的关键是内存的利用率。而对内存的利用上,还没有一门语言能达到c/c++相同的级别。所以对于一些同时在线不多,交互少的游戏,用什么语言无所谓,但是单服同时在线人数过1000,强交互的游戏基本都选择c++。

举几个例子让我的论述更有说服力一些(注意我一直说的是大型项目):

  1. Naughty Dog使用Object LISP开发几个大作后迫于SONY对于生态的问题换回了传统方式(C、C++)

2. 育碧有个职务叫general-programmer,基本上都会同时跟进前端和后端还有其他方面。(是的我就是这个职务开始的)

3. 大部分3A手游都是C++做的,比如现在的UE4发移动端,同一个引擎大部分技术就共享了。Android没有ndk之前,哪里有3A游戏在android上。慢慢的移动平台开发越来越像pc开发了,共享就更有优势了。

4. 微软都放弃XNA框架了回归native开发了,推纯C#大型游戏开发目前还是扶不起来啊。(具体原因忘知情人士透露)

5. 连Unity都用IL2CPP生成native了,一个是性能,另一个是移植mono后端成本太高了(当然还有其他比如授权的原因)。说明对于大引擎来说,脱离上游维护自己的工具链(还仅仅是个运行时)成本还是非常大的。

6. 选java或者go做服务器的,都是想利用它们做web后端的生态。大公司有自己的C++生态所以大公司用C++好处多,小公司可能就不一样了,只能抱web大腿。

C++写服务器的弊端

如果你写过node.js,python,或者php你偶尔会心疼下常年写C++的自己,不,是自己掉的头发

  • 用C++写逻辑简直是反人类,实现同样一个功能代码量多N倍(你和node.js的技术比一下,他能用四五行代码能写出一大堆业务逻辑的实现)。

  • C++逻辑出了bug就是能core掉你一组服务器的bug。项目团队大了+再牛逼的人也会有脑抽的时候,线上服务器随时都有core掉的风险。

  • 早期端游没多少的时候,是卖方市场,你的游戏挂了我玩家就没其他游戏可玩了。后来端游是买方市场,你的游戏挂了我只要付出成本没多少我一个不爽就换另一款跟你品质差不多的游戏去了。所以热更新已经成为大厂端游标配。纯C++服务端怎么热更新?所以你会听说到大批老的纯C++写服务端的页游、端游热更新的唯一办法是快速重启(事实如此,不用听说,听说是经不起推敲的)。

 

为什么还有团队在招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++叉某种脚本(C++ &lua较多)。
优点:一般是大厂职位,技术积累雄厚。
缺点:底层部分碰不得。即使有代码你也不敢改,很多都是线上跑过几年的,即使发现有bug你敢改吗?

第二类。各种模型的服务端开发框架。比如直接Erlang,比如云风的skynet,比如网易的pinus或者pomelo。
优点:大部分搞游戏服务端的程序员思维是比较传统的,只认逻辑线程+IO线程的死理,他们虽然没用过actor,但就是觉得MMO拆成actor不靠谱。但是程序员的初心应该就是学习新知识,所以你到这种团队可以远离没初心的程序员接触有初心的程序员。
缺点:基本上是限定工作城市在广州,杭州,西安了(可能还有其他城市)。

第三类。游戏服务器开发平台,比如photon,playfab,gamesparks,GAE等。
优点:开发者不需要关注网络底层库,缓存,负载,只需要关注自身的游戏逻辑即可,大多数平台可以根据服务器压力横向扩展,这些平台能提供一些玩家数据存储,排行榜,多人匹配,多人对战,GM,热更新配置和部分业务逻辑,而且语言开发基本上都是js,java,甚至有些直接只需要在后台配置即可,从dev环境切换到prod环境也很方便。
缺点:部分服务的收费比较高,而且免费试用期限较短,对于大型项目使用前期费用不少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

危险!!!也许你的web网站或服务正在悄无声息地被SQL注入

2010年秋季,联合国官方网站遭受SQL注入攻击。 2014年一个叫“TeamDigi7al”的黑客组织攻击了美国海军的一个名为“Smart Web Move”的web应用。此次事件直接造成美国海军数据库超过22万服役人员的个人信息被泄露。而事后,美国海军动用了超过50万美元来弥补此次的数据泄密事故…

手把手教你使用sql注入来绕过游戏后台检测

SQL注入毫无疑问是最危险的Web漏洞之一,因为我们将所有信息都存储在数据库中。其解决方案之一,有许多公司实施Web应用程序防火墙和入侵检测/预防系统来试图保护自己。但不幸的是,这些对策往往是不充分的,并且很容易被绕过。 尽管不能依赖防火墙来防止所有SQL注入,但一些防…

设计模式 ---适配器模式

在一些业务场景里,你是否遇到过如下类似的需求: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换…

关于游戏排行榜设计开发的一些总结

前言 不管是手游还是端游,貌似都离不开排行榜,没有排行榜的游戏是没有灵魂的游戏,因为排行榜可以让用户分泌多巴胺,这样日活才会上来,有了用户就有钱赚。产品想方设法的让用户留存,设计各种排行榜:个人段位排名、个人积分或金币排名、全球榜单实时排名。如果用户量少的话…

游戏中的常见概率设计分析

前言游戏中的概率真的是让人又爱又恨,很多玩家因为自己的屌丝气质(白嫖)而弃坑玩不下去的,比如人尽皆知的某阴阳师,除了氪金,还肝,而且如果你的脸真的非常的黑,那也是打不过那些0氪金…

一个通用游戏后台的设计模式实践总结

搞业务开发的时候,发现有一些代码的开发会让人感觉非常简便舒服,有一些代码的开发却有时候会让人感觉心智负担比较大。逐步总结的过程中,发现让开发人员写起来感觉舒服的代码,大概率是因为当前模块与其他模块代码耦合度低&#xf…

使用nginx分片功能提升缓存效率,支持可拖拽式播放视频

Nginx的slice模块可以将一个请求分解成多个子请求,每个子请求返回响应内容的一个片段,让大文件的缓存更有效率。 HTTP Range请求 HTTP客户端下载文件时,如果发生了网络中断,必须重新向服务器发起HTTP请求,这时客户端已经有了文件的一部分,只需要请求剩余的内容,而不需要…

leetcode116. 填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针 难度中等128 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&am…

你的代码是否按照高内聚、低耦合的原则来设计的?

我们一直强调软件开发中要按照高内聚、低耦合的设计原则来做代码结构设计。c语言和c++不同,c语言面向过程、c++面向对象。 真正的项目中,要对业务升级,原来的业务函数需要保留,要保证老的功能继续维持,不能直接删除,这时候c语言面向过程,通常使用回调的方法。c+…

leetcode117. 填充每个节点的下一个右侧节点指针 II

给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 初始状态下,所有 next 指针都被…

你担心大家会滥用的全局变量,大家(包括你自己)一定会滥用

前言 不要使用全局变量的道理大家都懂,基本上在大家学习编程过程中很早就会被教育到,但是有时候我们也会禁不住诱惑用到一些似非实是的全局变量,只不过这些全局变量会穿上马甲,让你不会一下看穿它的巨大危害,滥用全局变量会引申带来其它更为严重的结构性系统问题。…

Android Studio下载安装教程及开发环境搭建

Android Stuio是本次Google io的一大亮点啊,一大早起来就赶紧下载来玩玩了。。。 如果你不幸被墙了,可以去这个帖子下载,我已经上传到百度盘里面了。 [Android利器]Android Studio下载地址来啰 。。http://www.eoeandroid.com/thread-275380-…

暴雪游戏走后,谁来接盘?对网易有何影响?

11月16日,暴雪娱乐公司宣布,由于与网易的现行许可协议将于2023年1月23日到期,将暂停在中国大陆的大部分暴雪游戏服务。这些暴雪游戏包括《魔兽世界》《炉石传说》《守望先锋》《星际争霸》《魔兽争霸 III:重制版》《暗黑破坏神 II…

三次握手与四次挥手

三次握手 三次握手是指在建立TCP连接时,需要client端和server端共进行三次信息确认。 第一次握手:建立连接。client发送连接请求报文段(SYN位置为1,Sequence Number为x),然后,client端进入SYN…

leetcode619. 只出现一次的最大数字(SQL)

表 my_numbers 的 num 字段包含很多数字,其中包括很多重复的数字。 你能写一个 SQL 查询语句,找到只出现过一次的数字中,最大的一个数字吗? --- |num| --- | 8 | | 8 | | 3 | | 3 | | 1 | | 4 | | 5 | | 6 | 对于上面给出的样例…

socket入门

socket 简介 Socket即套接字,就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络…

SPI、I2C、UART 三种串行总线对比介绍

转载自https://blog.csdn.net/oqqHuTu12345678/article/details/65445338 参考博客 https://blog.csdn.net/xiaodingqq/article/details/80342459 https://blog.csdn.net/weiqifa0/article/details/8845281 https://www.zhihu.com/question/22632011 http://www.360doc.cn/…

栈与堆的区别(内存分配与数据结构)

参考自https://blog.csdn.net/K346K346/article/details/80849966/ 堆(Heap)与栈(Stack)包含两层含义: 程序内存布局场景下的内存管理方式数据结构中的两种常见的数据结构 1. 程序内存分配中的堆与栈 1.1 栈介绍 …

深入学习卷积神经网络(CNN)的原理知识

转载自https://www.cnblogs.com/wj-1314/p/9754072.html 在深度学习领域中,已经经过验证的成熟算法,目前主要有深度卷积网络(DNN)和递归网络(RNN),在图像识别,视频识别,语…