爲何遊戲服務端用開發效率低的C++來寫,其餘語言沒法勝任嗎?

其實如今遊戲服務端基本上都是多語言組合開發的,C++已經再也不是惟一選擇,Java、Python、Golang、Erlang、C#以及各類腳本語言都會涉及。可是爲何現現在大多數遊戲服務端仍是用C++來寫呢?我認爲一個項目在作技術選型時把C++做爲遊戲服務端的主要開發語言主要基於如下緣由:算法

爲何遊戲服務端用開發效率低的C++來寫,其餘語言沒法勝任嗎?

 

十多年前,技術棧,包含編程語言的選擇還不是不少。C++是當時看來少數,被證實穩定,可靠,高性能,具有豐富功能的高級語言。因此理所固然被選擇做爲開發主力。基於此,進程框架,諸如線程模型,定時器,容器等;IPC,好比socket,共享內存,並由共享內存進一步衍生出的數據恢復技術等都蓬勃發展。並且大廠以前都有封閉的思想,這和如今開源流行徹底不一樣。生怕別人知道本身的技術優點,也很是不信任社區產品的質量。結果就是——造輪子,各類造。從數據庫,到序列化工具,從xml解析器到負載均衡組件,凡是遊戲開發碰到的,所有本身造,並且都拿C++造。數據庫

爲何遊戲服務端用開發效率低的C++來寫,其餘語言沒法勝任嗎?

 

遊戲存在高性能需求場景目前無可替代。別的不說,一個簡單的幀同步,每秒30/60幀,多人數據同步。如今咱們用C++也只能支持單機小几千,大概就是每秒十多萬個包吧。因此沒有很強的信心換成別的語言。由於成本已是這樣了,爲什麼要在機器成本無法明顯優化的狀況下,再去增長技術風險和遷移成本?在一些卡牌類型遊戲中,後端也存在大量的數值密集型計算。雖然在架構上能夠分佈式,能夠擴展,但下降機器成本一樣很是重要。特別是對在線規模很大的遊戲而言尤爲重要,由於即便能優化10%,背後的機器數量恐怕也不是一個能夠忽略的數目。編程

爲何遊戲服務端用開發效率低的C++來寫,其餘語言沒法勝任嗎?

 

但整體上,隨着技術的發展,百花齊放應該是大趨勢。選擇合適的語言,在合適的場景,作合適的事情,這是你們逐漸認同的。並且不少嘗試都在解耦,從庫依賴變成服務間通訊,這樣更有助於不一樣語言共生。如今基本造成,高性能C/C++,靈活邏輯腳本化,運維工具Python,大數據用spark,日誌流用elk,旁路檢索或查詢用jvm系的局面。對開發人員而言,語言的要求慢慢從一招鮮變成了一專多能。惟一不變的是,業務需求永遠在變,解決問題的技術就是好的技術。後端

爲何遊戲服務端用開發效率低的C++來寫,其餘語言沒法勝任嗎?

 

那麼C++和其餘編程語言在遊戲開發上的優劣勢對比:緩存

爲何遊戲服務端用開發效率低的C++來寫,其餘語言沒法勝任嗎?

 

C++:

網絡 IO:歷史上這方面曾經是考量的主要因素,近年來幾乎全部主流後端語言都封裝有高效的網絡 IO 庫,C++ 已不具有獨特優點。安全

CPU 利用率:C++ 在這方面的優點不須要討論了。服務器

實時性:無 GC,內存分配延遲可控(內存池、預分配等),毫秒級延遲需求的高頻交易都在用。網絡

穩定性和容災:用C++寫出長期穩定運行的服務器程序,對開發團隊而言是件要求比較高的事情,尤爲在邏輯複雜又變動頻繁的前提下。語言自己也不保證內存訪問的安全性,若是有內存寫越界致使的Crash也很難定位。國內某大廠採用了分離數據和邏輯進程,經過進程間共享內存來通訊的方式,來實現邏輯進程崩潰重啓不丟失數據。不過這種作法有必定門檻,存在性能開銷,並且對開發效率和靈活性也有比較大的約束,也不易整合第三方庫,不能算是通用的最佳實踐。多線程

開發效率:若是有良好的內力和C++編程素養,而且配合現代C++的一些語法(auto、lambda、智能指針等),開發效率尚可算是勉強及格,但相對如下討論的其餘語言來講仍處於劣勢,然而達到上述水準的人力資源成本卻要比其它語言要高出很多(人員補充速度、培訓週期和薪資)。綜合而言,這方面可算 C++的一大短板。架構

爲何遊戲服務端用開發效率低的C++來寫,其餘語言沒法勝任嗎?

 

Java:

優勢:

  • 生態圈成熟,庫豐富。
  • Netty 網絡庫性能強悍。
  • 不爽語法還能夠用 scala 和 kotlin...

缺點:

· 除了原始類型外,不支持自定義值類型。並且泛型是以類型擦除的方式實現。這樣的特性致使了:難以把數據連續緊湊地進行表示來優化算法的緩存命中率,好比2D地圖的每一個格子座標都是個object。3D 場景的碰撞體每一個頂點都是個object。對本來對實時性不甚友好的 GC 形成了更大壓力。

· 成熟的 JVM 實現並不怎麼側重 GC 的實時性。若是觸發了百毫秒以上的世界凍結 GC 延遲,全部在線玩家都會受到影響。

· JIT 在預熱不足的狀況下,偶爾會致使性能曲線不平滑,引入預料以外的響應延遲。

爲何遊戲服務端用開發效率低的C++來寫,其餘語言沒法勝任嗎?

 

C#:

優勢:

  • 開發友好,語法糖甜。
  • 有真正的泛型和值類型。特定算法好優化。

缺點:

· 微軟家的。微軟家的。微軟家的。跑在 Windows Server下沒什麼問題,然而拋開受權費不談,大部分主流的開源好物都是優先考慮 Unix / Linux,好比 Redis(長期沒有 Windows 版本的官方支持)、MongoDB(Windows 下性能要弱於 Linux 下),並且 Windows Server 的網絡性能也要弱一些。除非解決方案都用微軟全家桶,否則部署和運維就須要同時維護兩個平臺...至於 Mono,跟 JVM 比起來就像玩具。只能期待 Rosalyn 成熟了。

· GC 實時性相似 Java。

爲何遊戲服務端用開發效率低的C++來寫,其餘語言沒法勝任嗎?

 

Go:

優勢:

  • 語法簡單易掌握。
  • 開發體驗友好。
  • 有值類型。
  • 新版本的 Go,GC 實時性良好(1.8 號稱 STW 控制在 1ms 之內)。

缺點:

· 沒有範型,某些地方須要轉型成 interface{},不過編譯器會作逃逸分析,沒必要要的地方不會自動 boxing,影響不算太嚴重。

爲何遊戲服務端用開發效率低的C++來寫,其餘語言沒法勝任嗎?

 

Rust:

優勢:

  • 運行效率比肩 C++。
  • 語言特性優秀。
  • 編譯期保證了內存安全,沒有 GC 開銷。
  • 編譯期保證線程安全,能夠放心大膽地併發,容易寫出高效的多線程代碼。

缺點:

  • 上手曲線較陡。
  • 太年輕,生態圈還沒有成熟。
  • 較小衆,人員補充困難。

通過近幾年的發展,C++開發效率也不算低,雖然對新人依然不怎麼友好,可是從技術選型的角度來看依然是不少領域的不二之選。

 

小編推薦一個學C/C++的學習qun 5999,45900 學習歷來不是一我的的事情,要有個相互監督的夥伴,工做須要學習或者爲了入行、轉行 均可以,qun內有開發工具,不少乾貨和技術資料。

相關文章
相關標籤/搜索