天天看點

閑話目前遊戲伺服器的開發

(後來在工作中我經常會遇到過不少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你敢改嗎?