???????我是從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++確實是一個寫服務器的好語言。
上限高
掌握核心技術
生態和其他
上限高,也就是性能極致。大公司一般不會采用上限低的技術,3A產品都是各種極致的集成,比如WOW這種規模的產品。什么開發成本,開發難度等,對于他們都不是大問題,反而因為上限低導致關鍵功能實現不了,這個才是硬傷。能堆人解決的都不是事,就怕堆人也解決不了,比如硬件限制。想想之前那些連STL,虛函數都不讓你用的這種場景發生在多少大公司中你就明白了。
掌握核心技術。大公司不可能讓自己的核心技術被別人控制。想想華為為什么研發鴻蒙系統。所以大公司造輪子都是常態。即便UE開放源代碼,大公司都會繼續研發自己的引擎,沒有任何選擇,錢都不是問題。核心技術基本都是基礎設施,C++是大頭。?
????????所以基于這3點,大公司是不可能用其他技術作為核心工具的,C#,Java和Go敗在性能,Rust敗在生態。
很多時候,游戲服務器的瓶頸通常不是在cpu,也不是在io,而是在內存。游戲不同于網站服務器,游戲在線玩家數據都會放在內存,數據庫只是作為一個數據持久化的存在。所以限制游戲服務器同時在線人數的關鍵是內存的利用率。而對內存的利用上,還沒有一門語言能達到c/c++相同的級別。所以對于一些同時在線不多,交互少的游戲,用什么語言無所謂,但是單服同時在線人數過1000,強交互的游戲基本都選擇c++。
舉幾個例子讓我的論述更有說服力一些(注意我一直說的是大型項目):
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環境也很方便。
缺點:部分服務的收費比較高,而且免費試用期限較短,對于大型項目使用前期費用不少。