曾子曰:吾日三省吾身——為人謀而不忠乎?與朋友交而不信乎?傳不習(xí)乎?

引言

上一篇我們談到了在游戲引擎,或者在程序和高級(jí)編程語(yǔ)言中,設(shè)計(jì)一個(gè)統(tǒng)一對(duì)象模型得到的好處,和要付出的代價(jià),以及在UE里是怎么對(duì)之盡量降低規(guī)避的。那么從本篇開(kāi)始,我們就開(kāi)始談?wù)勅绾伍_(kāi)始構(gòu)建這么一個(gè)對(duì)象模型,并在此之上逐漸擴(kuò)展以適應(yīng)引擎的各種功能需求的。

眾所周知,一般游戲引擎最底層面對(duì)的都是操作系統(tǒng)API,硬件SDK,所能借助到的工具也往往只有C++本身。所以考慮從原生的C++基礎(chǔ)上,搭建對(duì)象系統(tǒng),往往得從頭開(kāi)始造輪子,最底層也是最核心的機(jī)制當(dāng)然必須得掌控在自己的手中,以后升級(jí)改善增加功能也才能不受限制。

那么,從頭開(kāi)始的話,Object系統(tǒng)有那么多功能:GC,反射,序列化,編輯器支持……應(yīng)該從哪一個(gè)開(kāi)始?哪一個(gè)是必需的?GC不是,因?yàn)榇蟛涣宋铱梢灾苯觧ew/delete或者智能指針引用技術(shù),畢竟別的很多引擎也都是這么干的。序列化也不是,大不了每個(gè)子類里手寫(xiě)數(shù)據(jù)排布,麻煩是麻煩,但是功能上也是可以實(shí)現(xiàn)的。編輯器支持,默認(rèn)類對(duì)象,統(tǒng)計(jì)等都是之后額外附加的功能了。那你說(shuō)反射為何是必需的?大多數(shù)游戲引擎用的C++沒(méi)有反射,不也都用得好好的?確實(shí)也如此,不利用反射的那些功能,不動(dòng)態(tài)根據(jù)類型創(chuàng)建對(duì)象,不遍歷屬性成員,不根據(jù)名字調(diào)用函數(shù),大不了手寫(xiě)繞一下,沒(méi)有過(guò)不去的坎。但是既然上文已經(jīng)論述了一個(gè)統(tǒng)一Object模型的好處,那么如果在Object身上不加上反射,無(wú)疑就像是砍掉了Object的一雙翅膀,讓它只能在地上行走,而不能在更寬闊空間內(nèi)發(fā)揮威力。還有另一個(gè)方面的考慮是,反射作為底層的系統(tǒng),如果實(shí)現(xiàn)完善了,也可以大大裨益其他系統(tǒng)的實(shí)現(xiàn),比如有了反射,實(shí)現(xiàn)序列化起來(lái)就很方便了;有沒(méi)有反射,也關(guān)系到GC實(shí)現(xiàn)時(shí)的方案選擇,完全是兩種套路。簡(jiǎn)單舉個(gè)例,反射里對(duì)每個(gè)object有個(gè)class對(duì)象保存信息,所以理論上class身上就可以保存所有該類型的object指針引用,這個(gè)信息GC就可以利用起來(lái)實(shí)現(xiàn)一些功能;而沒(méi)有這個(gè)class對(duì)象的話,GC的實(shí)現(xiàn)就得走別的方案路子了。所以說(shuō)是先實(shí)現(xiàn)反射,有了一個(gè)更加扎實(shí)的對(duì)象系統(tǒng)基礎(chǔ)后,再在此之上實(shí)現(xiàn)GC才更加的明智。

類型系統(tǒng)

雖然之上一直用反射的術(shù)語(yǔ)來(lái)描述我們熟知的那一套運(yùn)行時(shí)得到類型信息的系統(tǒng),動(dòng)態(tài)創(chuàng)建類對(duì)象等,但是其實(shí)“反射”只是在“類型系統(tǒng)”實(shí)現(xiàn)之后的附加功能,人們往往都太過(guò)注重最后表露的強(qiáng)大功能,而把樸實(shí)的本質(zhì)支撐給忘記了。想想看,如果我實(shí)現(xiàn)了class類用來(lái)

網(wǎng)友評(píng)論