溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

為什么游戲引擎大多選擇使用 c++ 而不是 c 開(kāi)發(fā)?

發(fā)布時(shí)間:2020-07-13 18:42:32 來(lái)源:網(wǎng)絡(luò) 閱讀:759 作者:CPPLinux開(kāi)發(fā) 欄目:開(kāi)發(fā)技術(shù)

為什么那些引擎選擇 C++ 而不是 C,或者說(shuō)在游戲引擎的開(kāi)發(fā)中有哪些功能、特性是可以通過(guò) C++ 開(kāi)發(fā)而不可以通過(guò) C 的?

我也曾經(jīng)試著用C寫,可結(jié)果發(fā)現(xiàn)開(kāi)發(fā)效率、代碼可讀性,都不是一個(gè)檔次的。最后才明白,發(fā)明C++的人確實(shí)是為了解決一些問(wèn)題,而不是閑的蛋疼。

如何成為一個(gè)優(yōu)秀的高級(jí)C++程序員
當(dāng)初我是非常討厭C++語(yǔ)言的,我認(rèn)為C++能做的C都能做,它只是個(gè)語(yǔ)法糖而已,簡(jiǎn)單才是最美的,為什么我要去浪費(fèi)時(shí)間研究那些詭異的特性。

后來(lái)慢慢的我對(duì)C++的態(tài)度變了,現(xiàn)在我覺(jué)得C++雖然不完美,但是夠用。它比C可讀性好,做到了開(kāi)發(fā)效率和運(yùn)行效率的折中,是我寫代碼的首選語(yǔ)言。

其 實(shí)并不是全部C++,最主要的架構(gòu)核心部分C++而已,一個(gè)游戲引擎涉及到的內(nèi)容超級(jí)龐大,又要搞效率高性能,又要好效果和易于擴(kuò)展。高性能的關(guān)鍵核心代 碼會(huì)使用匯編實(shí)現(xiàn),比如SIMD指令進(jìn)行各種浮點(diǎn)數(shù)學(xué)運(yùn)算,高開(kāi)發(fā)效率比如工具層,會(huì)使用腳本等來(lái)實(shí)現(xiàn)。而只有C++這樣的全能語(yǔ)言才能做到在匯編和腳本 語(yǔ)言中間進(jìn)行承上啟下。

也就是說(shuō)C++在游戲引擎中負(fù)責(zé)最主要的架構(gòu)部分。

這部分包含了最重要的工程組織,從底層的基礎(chǔ)庫(kù): 擴(kuò)展std/boost數(shù)據(jù)結(jié)構(gòu),封裝時(shí)間、IO/文件系統(tǒng)、多線程、反射、內(nèi)存管理、數(shù)學(xué)庫(kù)。。。。到中間層:窗口、游戲循環(huán)、輸入設(shè)備/消息、圖形渲 染接口層抽象、實(shí)時(shí)圖形渲染管線設(shè)計(jì)、物理/碰撞檢測(cè)、尋路、骨骼、動(dòng)作、模型。。。。再到通用最上層的世界空間層次組織、天空盒、植被、水、粒子特效、 相機(jī)、。。。。

C++的開(kāi)發(fā)效率肯定是高于C的,高一倍沒(méi)壓力,所以可以用省下來(lái)的開(kāi)發(fā)時(shí)間去做性能優(yōu)化。

一般來(lái)說(shuō),沒(méi)有優(yōu)化過(guò)的C++代碼用 Profiling工具壓榨出2~4倍的性能是很可能的。

而用C就算性能好,也沒(méi)好到C++的3~4倍,好10~30%就不錯(cuò)了。

極端優(yōu)化后的代碼,C要好于C++,但是相同時(shí)間內(nèi)開(kāi)發(fā)出來(lái)的代碼 C++性能會(huì)好于C,而且C++可讀性可維護(hù)性要遠(yuǎn)遠(yuǎn)好于C。

的確沒(méi)有什么不能通過(guò)C來(lái)做的。但C++更好。

因?yàn)橛螒蝽?xiàng)目是個(gè)工程問(wèn)題,關(guān)注開(kāi)發(fā)效率。

而游戲引擎又是極端性能敏感的,關(guān)注執(zhí)行效率。

這要求引擎程序有足夠的彈性??珊暧^分析,也可微觀干預(yù)。

C++具有C簡(jiǎn)潔、直接和可移植的特性。

增加了語(yǔ)言層面的OO和一些良性范式。

在可控的資源損失前提下提高了生產(chǎn)力。

所以適合引擎開(kāi)發(fā)。

C 語(yǔ)言可以說(shuō)是一門設(shè)計(jì)的非常成功的語(yǔ)言。但是C語(yǔ)言沒(méi)有OOP的特性,在做一些大型項(xiàng)目的時(shí)候力不從心。一些大型的C項(xiàng)目,隨著項(xiàng)目的臃腫,人類基本沒(méi)辦 法維護(hù)這個(gè)項(xiàng)目了。要維護(hù)這么龐大的項(xiàng)目而又不出錯(cuò),只能加入一些OOP特性重構(gòu),有經(jīng)驗(yàn)的C程序員寫著寫著,很多概念就類似C++了。干脆直接轉(zhuǎn)C++ 算了。

但是C++卻是一門設(shè)計(jì)的非常不成功的語(yǔ)言。它為了實(shí)現(xiàn)大而全的功能,加入了非常多的特性,而這些特×××叉組合在一起就非常的復(fù)雜,人類非常難以駕奴它而且又容易出錯(cuò)。這也是很多程序員很恨C++的原因。

要解決C++的這個(gè)問(wèn)題,就是給C++訂一套規(guī)范。避免使用某些復(fù)雜特性,讓它變得足夠簡(jiǎn)單和具有高可讀性。在C++11的標(biāo)準(zhǔn)下,配合自己公司定一個(gè)科學(xué)的內(nèi)部規(guī)范,讓所有員工通過(guò)一個(gè)C++可讀性培訓(xùn)。那么C++用起來(lái)就非常爽手了。

c++ 和c相比,生產(chǎn)效率要高一點(diǎn)。雖然在一些商業(yè)游戲引擎中不使用stl自帶的模版,但都實(shí)現(xiàn)了自己的一套模版庫(kù),甚至實(shí)現(xiàn)了自己的string庫(kù)。如今的一 些商業(yè)3d引擎基本具備了跨平臺(tái)的能力,但是由于不同平臺(tái)的底層api(SIMD運(yùn)算,文件讀寫,圖形渲染)不一致,因此要對(duì)各平臺(tái)/API的共有特性進(jìn) 行抽象,這里c++比c更能勝任這樣的任務(wù)。(利益相關(guān):目前在學(xué)習(xí)swift+Metal)

目前,流行的unrealengine4是完全c++寫的,unity3d 5雖然有用c#但在將來(lái)會(huì)通過(guò)il2cpp轉(zhuǎn)換成c++,實(shí)現(xiàn)運(yùn)行效率的提升。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI