閑話目前游戲服務器的開發

???????我是從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.pswp.cn/news/444249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444249.shtml
英文地址,請注明出處:http://en.pswp.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小時服務,其他時間均不得以任何形式向未成年人提供網絡游戲服務。通知發布后,各大游戲廠商火速回…