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

       我是从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,一经查实,立即删除!

相关文章

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

本篇文章纯属文字,不需要配图。 首先以我个人观点来说,C ++对于我的吸引力不仅仅是它的技术优点。c++是个庞大而奇怪的语言,很多新领域会选择这个语言是因为有性能上的需求,但是又拿不准瓶颈会出在哪里,C++是一个什么地方调优都很方便的语言,内存,CPU,线程优先…

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

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

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

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

JSON是什么?如何产生的?

JSON:是一种轻量级的数据交换方式,它是基于javascript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。 掌…

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

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

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

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

leetcode6. Z 字形变换

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐行…

游戏排行榜-跳表实现原理分析

前言 做游戏的一般都有游戏排行榜的需求,要查一下某个uid的积分排名第几,这里我给大家推荐之前我们使用的一种排序算法,跳表skiplist。 跳表是一个随机化的数据结构。它允许快速查询一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(log n),优于普通队…

如何使用redis来实现常见的游戏排行榜

前言 前面几篇文章给大家聊了下目前的常用的排行榜做法。 关于游戏排行榜设计开发的一些总结 游戏排行榜-跳表实现原理分析 那么这篇文章将给大家带来如何使用redis来实现常见的游戏排行榜功能。 为什么使用redis 如果你已经是redis的高级玩家可以跳过这段介绍。下面这段redis的…

leetcode43. 字符串相乘 经典大数+和*

43. 字符串相乘 难度中等264 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 示例 1: 输入: num1 "2", num2 "3" 输出: "6" 示例 2: 输入: num1 &q…

ffmpeg优化mp4以及hls参数设置

ffmpeg是开源的音频视频编解码工具 然而默认的参数对MP4不友好,需要自己设置 这里记录一下简单的优化参数 优化MP4使moov atom位于文件开头 moov atom是mp4的索引信息. 浏览器获得moov atom后,可以随机搜索文件位置,让拖动自由 ffmpeg默认是将moov atom放在文件末尾,我们需要前…

游戏热更新:游戏客户端热更新那点事

前言 热更新的内容可以是美术资源,可以是代码,但相对来说,美术资源的更新不会受到约束,代码实际上是重灾区。本文介绍的主要是客户端代码热更新。 热更新对于开发者来说是一件麻烦事,特别对于看重效率、便捷性和结构的程序员来说,热更新就是运营人员的不懂技术的…

Unity客户端开发优化要点

脚本方面1、不需要高频率调用的函数,使用InvokeRepeating(或Time.frameCount%n)代替Update2、SetParent、Instantiate、Find、IO操作、SetActive、GetComponent等耗时较长的接口应在loading的时候做3、Update尽量减少代码逻辑、减少临时变量、…

leetcode214. 最短回文串

214. 最短回文串 难度困难114 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1: 输入: "aacecaaa" 输出: "aaacecaaa"示例 2: 输入: "abcd" 输出: "…

Java对象的序列化

对象序列化就是把一个对象变为二进制数据流的一种方法。 一个类要想被序列化,就行必须实现java.io.Serializable接口。虽然这个接口中没有任何方法,就如同之前的cloneable接口一样。实现了这个接口之后,就表示这个类具有被序列化的能力。 先…

游戏服务器架构:网络服务器端程序线程划分

服务器端高性能网络编程的核心在于架构,而架构的核心在于进程-线程模型的选择。 作为服务器需要做网络数据的收发,需要做数据库拉取和保存,需要做日志存储,需要做常规的游戏逻辑处理.....在这里我把这些功能划分为三个大的线程类型:IO线程,事件线程,第三方库线程。 …

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

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

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

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

leetcode103. 二叉树的锯齿形层次遍历

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 …

大型游戏后台实践浅谈

国家新闻出版署8月30日下发切实防止未成年人沉迷网络游戏的通知,要求从今天(9月1日)起,所有网络游戏企业仅可在周五、周六、周日和法定节假日每日20时至21时向未成年人提供1小时服务,其他时间均不得以任何形式向未成年人提供网络游戏服务。通知发布后,各大游戏厂商火速回…