為什麼遊戲服務端用開發效率低的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++或者為了入行、轉行學習C/C++的夥伴可以私信回覆小編“學習”領取全套免費C/C++學習資料、視頻

相關推薦

推薦中...