謝邀,根據知乎的風格,先問是不是,再問原因。
如果想進一步和我交流,可以點選下面的名片咨詢:
首先,就遊戲引擎來說,使用 C++ 開發的和使用 C 開發的,大致可以說是平分秋色,這大致有三方面的原因:
1. 歷史原因
C 語言誕生比 C++ 早,C 語言誕生原因是因為 Unix 作業系統,而 Unix 作業系統的誕生原因則是由於「玩遊戲需求」,以下來自 wiki 百科的 C 語言誕生歷史:
1964 年,由美國通用電氣公司和麻省理工學院發起了一個合資專案,該專案旨在開發一套能執行在 GE-645 等大型主機之上的多使用者、多工的分時作業系統,簡稱 MULTICS。1965 年,貝爾實驗室派出開發人員 KenThompson 等也加入了該專案,雖然專案期間釋出了一些版本的 MULTICS 產品,但由於執行效能較差,1969 年該專案以失敗告終。
由於 KenThompson 酷愛遊戲及遊戲編程,他在專案 MULTICS 期間編寫了一款名叫「星際旅行」(Startravel)的遊戲,並執行在該 MULTICS 系統上,但執行速度非常慢,且耗費昂貴。
1969 年 MULTICS 專案宣告失敗後,KenThompson 沒有放棄其遊戲的夢想,他在貝爾實驗室的庫房中,找到一台閑置的 PDP-7 裸機,但由於缺少作業系統,無法在該 PDP-7 上執行其遊戲。在 DennisRitchie 的幫助下,他使用組合語言為該 PDP-7 編寫了一個作業系統雛形,並把其遊戲成功執行在了該作業系統之上。該作業系統體現出了很多優勢,受 MULTICS 專案開發經驗的啟發, DennisRitchie 和 KenThompson 在該遊戲作業系統雛形的基礎上,進一步完善和開發新功能,最終於 1970 年開發出了一款新的多使用者、多工作業系統,稱為 UNIX 作業系統。
也就是說,1969—1970 年,美國貝爾實驗室的 KenThompson 和 DennisRitchie 等使用組合語言編寫了第一個版本的 UNIX 作業系統。
由於 UNIX 作業系統良好的效能,在其釋出初期,就得到迅速的推廣和套用。1973 年,KenThompson 和 DennisRitchie 在做系統內核移植開發時,感覺使用組合語言很難實作。後來決定使用一種稱為 BCPL(BasicCombinedProgrammingLanguage) 的語言進行開發,在開發過程中,他們在 BCPL 的基礎上做了進一步的改進,推出了 B 語言(取 BCPL 第一個字母)。
後來發現使用 B 語言開發的 UNIX 內核,還是無法達到他們的預期要求,於是在 B 語言的基礎上,做了進一步的改進,設計出了具有豐富的數據類別,並支持大量運算子的程式語言。改進後的語言較B語言有質的飛躍,取名為 C 語言,並使用 C 語言成功重新編寫了 UNIX內核。
至此,使用 C 語言編寫內核的 UNIX 版本已相當穩定,且具有良好的可移植性,為 UNIX 的進一步推廣和普及奠定了堅實的基礎,也展現了 C 語言與 UNIX 的完美結合及 C 語言在編寫系統軟件時得天獨厚的優勢。
由此可見,C 語言的起源與 UNIX 的改進是密不可分的,也體現了 C 語言在編寫系統軟件時的優勢。
透過上文我們可以知道: C 語言誕生於 1969 年至 1973 年間,而 C++ 誕生於 20 世紀 80 年代。
比雅尼·斯特勞斯特魯普博士在貝爾實驗室工作期間發明並實作了C++。起初,這種語言被稱作「C with classes」(「包含‘類’的 C 語言」),作為 C 語言的增強版出現。隨後,C++不斷增加新特性。虛擬函式(virtual function)、運算子多載(operator overloading)、多繼承(multiple inheritance)、標準樣版庫(standard template library, STL)、例外處理(exception)、執行時類別資訊(runtime type information)、名字空間(namespace)等概念逐漸納入標準。1998年,國際標準組織(ISO)頒布了C++程式設計語言的第一個國際標準ISO/IEC 14882:1998,目前最新標準為 ISO/IEC 14882:2020。根據【C++編程思想】(Thinking in C++)一書,C++ 與 C 的程式碼執行效率往往相差在±5%之間。那在有 C 語言而沒有 C++ 的年代裏,在這二者之間只能用 C 語言編寫遊戲引擎,同時也培養和沈澱了一大批精通 C 的高手,他們很多轉到遊戲行業,編寫了很多遊戲引擎。
2. 開發效率與效能問題
先說效能問題。
對於早期版本的 C++ 來說,確實可以看成 C with classes(今天的 C++ 版本已經不能簡單這麽認為了)。實作同樣的功能,C 語言背後可以直接對應著直白的機器碼,而對於 C++ 卻不是,C++ 編譯器為開發者的 C++ 程式碼插入了大量自己的程式碼。有人就說, C++ 相比較 C 語言的最本質的區別就是解構函式 (這句話請認真體會)。
那麽如果對於一些追求效能的遊戲引擎,肯定就不能接受 C++ 相比較 C 語言增加的效能損耗。例如,那個年代風靡一時的雷神(Quake III),你可以看看它的源碼,源碼下載地址:
連結: https:// pan.baidu.com/s/10fjHP2 EbuyjsF22dadvJKA 提取碼: 6mkt關於雷神的開發故事,有一本叫【Doom 啟示錄】的書,這本書忠實詳盡地講述了兩個玩家是如何走上遊戲之路,如何制作出迄今為止影響力最大的遊戲作品--DOOM和Quake,以及他們為何在最輝煌的時候分道揚鑣。本書是國內第一部遊戲領域的傳記。與所有傳記一樣,不同的讀者能從中得到不同的體驗:或是那遊戲制作的背景內幕、光環之中的趣聞軼事、年少創業的夢想豪情、奮鬥途上的汗水艱辛,亦或是那成名之後的勢易情遷,獨辟蹊徑的商業模式、天下為公的黑客精神、眾說紛紜的暴力問題…
【Doom 啟示錄】高畫質版 pdf 下載地址:
連結: https:// pan.baidu.com/s/1Z5Q7qX 3hb_YmAMKf9epMXw 提取碼: he5h關於雷神的引擎的源碼還流傳著一個有趣的故事:
我一個同學在魔獸世界專案組做開發,他和我說,魔獸世界的源碼也是使用 C 開發。
其實不僅是遊戲引擎,對於追求效能的軟件專案,例如 Redis、Nginx 等,都優先使用 C,而不是 C++。
再說開發效率問題。
C++ 相比較 C,支持物件導向特性。嚴格來說,物件導向是一種思想,對於高手來說,使用 C 語言也能寫出物件導向的程式碼來。但是對於普通人來說,C++ 很好地支持物件導向特性(支持 class 關鍵字),物件導向的基本思想是開發的程式碼要像現實生活一樣,盡量把物事抽象成一個個物件類別,這樣可以大大提高開發效率。對於大多數遊戲引擎來說,相比較 C 語言,C++ 損耗的效能是可以接受的,使用 C++ 可以大振幅提高團隊開發效率,因此會選擇 C++。
例如,開源版本的魔獸世界程式碼(World of Warcraft):
連結: https:// pan.baidu.com/s/1qbyPVN elNGmNMry1gLJwnw 提取碼: rr72大型線上對戰遊戲——英雄之刃(類似於騰訊的英雄聯盟)均屬於此類:
連結: https:// pan.baidu.com/s/1TgZTpq TwTgf2QEnfEpoyLg 提取碼: gge3伺服器端有非常多的模組,程式碼質素非常高,各個服務均使用 C++ 編寫,遊戲主要服務關系圖如下:
再比如國產遊戲——仙劍奇俠傳(英譯名:Chinese Paladin 或 Legend of Sword and Fairy,由上海軟星開發):
仙劍奇俠傳源碼及編譯部署教程下載地址:
連結: https:// pan.baidu.com/s/1ZAshHk MRTbPQyAoSznddew提取碼: y41g
3. 技術傳承和開發人員技術棧問題
和其他專案一樣,有些一些專案開始使用的是 C 開發,那麽後來的開發者或者維護者,除了一個重大原因,不然也會繼續使用 C 開發,C++ 專案也一樣,這就是我說的技術傳承。
另外,一個原因是,一些開發人員或者團隊核心負責人對 C 或者 C++ 更熟悉一些,可能就會選擇相應的語言去開發,這是由遊戲引擎的核心開發人員或者技術團隊的技術棧決定的。
給想從事遊戲開發的同學一些建議
如果你不是對遊戲開發特別感興趣,建議謹慎地選擇遊戲行業!
如果你不是對遊戲開發特別感興趣,建議謹慎地選擇 遊戲 行業!
如果你不是對遊戲開發特別感興趣,建議謹慎地選擇 遊戲 行業!
重要的話說三遍,如果你還是想學習遊戲開發,下面是一些做好遊戲開發的建議:
1. 先學好 C++。
這類書很多,找一本適合自己的即可。不建議看【C++ Primer】這樣的大部頭,掌握 C++ 常用語法就可以了。當然 C++ 原理性的東西還是需要了解一下,推薦看下【 深度探索C++物件模型 】。
深度探索C++物件模型連結: https:// pan.baidu.com/s/1Pc-IWg jk9VJ5MrUV1gsxbw 提取碼: 511b
2. 學好網絡編程,做到熟練使用常見作業系統的 Socket API。
推薦如下兩本書:
連結: https:// pan.baidu.com/s/1sJpxJT rV0ErKXWVG0v045A 提取碼: gqgp
看完這兩本書,你還能學到一些 C++ 伺服器程式框架、結構等一些套路( 上文推薦的遊戲源碼都是不錯的學習資料 )。
3. 學一些遊戲開發的知識
如各種動畫原理、訊框同步技術等。
最後分享一份我精心整理的 C++ 進階書單:
好啦,就寫這麽多啦。
原創不易,如果覺得有用,請給 @張小方 點個贊~~