1. 程式人生 > >C++和遊戲開發那些事,告訴你怎麼用C++縱橫遊戲程式設計!

C++和遊戲開發那些事,告訴你怎麼用C++縱橫遊戲程式設計!

C語言和C++
C 語言可以說是一門設計的非常成功的語言。但是C語言沒有OOP的特性,在做一些大型專案的時候力不從心。一些大型的C專案,隨著專案的臃腫,人類基本沒辦 法維護這個專案了。要維護這麼龐大的專案而又不出錯,只能加入一些OOP特性重構,有經驗的C程式設計師寫著寫著,很多概念就類似C++了。乾脆直接轉C++ 算了。
(小編推薦一個學C語言/C++的學習裙【 七八八,六四九,七二零 】,入裙即送C/C++全套學習資料,滿滿的乾貨!)
c++ 和c相比,生產效率要高一點。雖然在一些商業遊戲引擎中不使用stl自帶的模板,但都實現了自己的一套模版庫,甚至實現了自己的string庫。如今的一 些商業3d引擎基本具備了跨平臺的能力,但是由於不同平臺的底層api(SIMD運算,檔案讀寫,圖形渲染)不一致,因此要對各平臺/API的共有特性進 行抽象,這裡c++比c更能勝任這樣的任務。(利益相關:目前在學習swift+Metal)
目前,流行的unrealengine4是完全c++寫的,unity3d 5雖然有用c#但在將來會通過il2cpp轉換成c++,實現執行效率的提升。
在這裡插入圖片描述


程式設計最重要的是實踐,就是寫程式碼、看別人寫的程式碼、再寫程式碼,你看再多的書,不寫程式碼,你還是不會程式設計。但是寫程式碼也要講究方法循序漸進,不能剛學了幾天語法,就想寫個作業系統什麼的,樹立這種不切實際的目標只會讓你的自信受到嚴重打擊迷失自我。同時小編推薦一個學C/C++的學習群627819188無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!群內有很多幹貨和技術分享!
C++與遊戲開發
C++是否遊戲開發者所必須的技術。個人認為,這並不是完全必須的,但許多遊戲開發專案需要到C++。以下列舉一些過往曾流行的遊戲平臺/型別:
PC單機遊戲(Windows)
PC網路遊戲(Windows、Linux)
移動平臺遊戲(J2ME、Symbian、Palm……)
家用遊戲機遊戲(PS1/2/3/4、XBox、Wii……)
掌上游戲機遊戲(GB、GBA、NDS、PSP……)
網頁遊戲(HTML、Flash)
智慧移動裝置遊戲(iOS、Android)
我們會發現,除了J2ME和網頁遊戲外,大多數的平臺都支援(或只支援)原生程式設計。而原生程式設計最常用的就是C/C++和彙編。
在這裡插入圖片描述

是否使用C++
C++並非萬能丹,我按經驗舉出一些C++的適用時機。C++適合構造程式中需求較穩定的部分,需求變化較大的部分可使用指令碼語言;程式須儘量發揮硬體的最高效能,且效能瓶頸在於CPU和記憶體;程式須頻繁地與作業系統或硬體溝通;程式必須使用C++框架/庫,如大部分遊戲引擎(如Unreal/Source)及中介軟體(如Havok/FMOD),雖然有些C++庫提供其他語言的繫結,但通常原生的API效能最好、最新;專案中某個目標平臺只提供C++編譯器的支援。
(小編推薦一個學C語言/C++的學習裙【 七八八,六四九,七二零 】,入裙即送C/C++全套學習資料,滿滿的乾貨!)
按應用領域來說,C++適用於開發伺服器軟體、桌面應用、遊戲、實時系統、高效能運算、嵌入式系統等。
(小編推薦一個學C語言/C++的學習裙【 七八八,六四九,七二零 】,入裙即送C/C++全套學習資料,滿滿的乾貨!)
很大程度上,遊戲──或說遊戲引擎,都是C++非常適合的應用時機。
一些人認為,遊戲開發者使用現成的引擎,就不需要使用C++了。過往,業界有一個普遍常識,就是用C++開發遊戲
引擎,而遊戲引擎提供指令碼引擎供編寫遊戲邏輯程式碼。但這個觀點被Unreal Engine4的決策改變,UE4放棄了維護多年且被大量使用的UnrealScript指令碼語言,而改用原生C++作為遊戲邏輯程式設計的語言。此決策背後有多個原因,
但這裡只想舉出這例子展示C++在遊戲開發中的用途及潮流,具體原因分析就不詳細展開了。
除了自行研發遊戲引擎需要使用C++,我們可以看到,大部分遊戲引擎都提供了其C++原始碼(Unity算是例外),這讓我們可以
方便除錯遊戲
深度剖析、優化遊戲的效能
為引擎擴充套件新功能
修改現有引擎以適應專案所需
在專業的遊戲開發中,這些都是很常見的工作任務。所以,即使並非自研引擎,並使用指令碼語言開發遊戲邏輯,也有很多機會需要使用C++。
在這裡插入圖片描述

為什麼那些引擎選擇 C++
在遊戲引擎的開發中有哪些功能、特性是可以通過 C++ 開發而不可以通過 C 的?C++雖然不完美,但是夠用。它比C可讀性好,做到了開發效率和執行效率的折中,是我寫程式碼的首選語言。
其實並不是全部C++,最主要的架構核心部分C++而已,一個遊戲引擎涉及到的內容超級龐大,又要搞效率高效能,又要好效果和易於擴充套件。高效能的關鍵核心代 碼會使用匯編實現,比如SIMD指令進行各種浮點數學運算,高開發效率比如工具層,會使用指令碼等來實現。而只有C++這樣的全能語言才能做到在彙編和指令碼 語言中間進行承上啟下。
也就是說C++在遊戲引擎中負責最主要的架構部分。
(小編推薦一個學C語言/C++的學習裙【 七八八,六四九,七二零 】,入裙即送C/C++全套學習資料,滿滿的乾貨!)
這部分包含了最重要的工程組織,從底層的基礎庫: 擴充套件std/boost資料結構,封裝時間、IO/檔案系統、多執行緒、反射、記憶體管理、數學庫。。。。到中間層:視窗、遊戲迴圈、輸入裝置/訊息、圖形渲 染介面層抽象、實時圖形渲染管線設計、物理/碰撞檢測、尋路、骨骼、動作、模型。。。。再到通用最上層的世界空間層次組織、天空盒、植被、水、粒子特效、 相機、。。。。
C++的開發效率肯定是高於C的,高一倍沒壓力,所以可以用省下來的開發時間去做效能優化。
一般來說,沒有優化過的C++程式碼用 Profiling工具壓榨出2~4倍的效能是很可能的。
而用C就算效能好,也沒好到C++的3~4倍,好10~30%就不錯了。
極端優化後的程式碼,C要好於C++,但是相同時間內開發出來的程式碼 C++效能會好於C,而且C++可讀性可維護性要遠遠好於C。
的確沒有什麼不能通過C來做的。但C++更好。
因為遊戲專案是個工程問題,關注開發效率。
而遊戲引擎又是極端效能敏感的,關注執行效率。
這要求引擎程式有足夠的彈性。可巨集觀分析,也可微觀干預。
C++具有C簡潔、直接和可移植的特性。
增加了語言層面的OO和一些良性正規化。
在可控的資源損失前提下提高了生產力。
所以適合引擎開發。
在這裡插入圖片描述
C++學習建議
C++缺點之一,是相對許多語言複雜,而且難學難精。許多人說學習C語言只需一本K&R《C程式設計語言》即可,但C++書籍卻是多不勝數。學習C++大概可分為4個層次:
第一層次,C++基礎:挑選一本入門書籍,如《C++ Primer》、《C++大學教程》、或Stroustrup撰寫的經典《C++程式設計語言》或他一年半前的新作《C++程式設計原理與實踐》,而一般C++課程也止於此,另外《C++ 標準程式庫》及《The C++ Standard Library Extensions》可供參考;
第二層次,正確高效地使用C++:此層次開始必須自修,閱讀過《(More)Effective C++》、《(More)Exceptional C++》、《Effective STL》及《C++程式設計規範》等,才適宜踏入專業C++開發之路;
第三層次,深入瞭解C++:關於全域性問題可讀《深入探索C++物件模型》、《Imperfect C++》、《C++沉思錄》、《STL原始碼剖析》,要挑戰智商,可看關於模版及模版超程式設計的書籍如《C++ Templates》、《C++設計新思維》、《C++模版超程式設計》;
第四層次,研究C++:閱讀《C++語言的設計和演化》、《程式設計的本質》(含STL設計背後的數學根基)、C++標準檔案《ISO/IEC 14882:2003》、C++標準委員會的提案書和報告書、關於C++的學術文獻。
(小編推薦一個學C語言/C++的學習裙【 七八八,六四九,七二零 】,入裙即送C/C++全套學習資料,滿滿的乾貨!)
由於我主要是應用C++,大約只停留於第二、三個層次。然而,C++只是軟體開發的一環而已,單憑語言並不能應付業務和工程上的問題。建議各位不要強求幾年內“徹底學會C++的知識”,到達第二層左右便從工作實戰中汲取經驗,有興趣才慢慢繼續學習更高層次的知識。雖然學習C++有難度,但也是相當有趣且有滿足感的。