引言
上文講到了UE的類型系統(tǒng)結(jié)構(gòu),以及UHT分析源碼的一些宏標(biāo)記設(shè)定。在已經(jīng)進(jìn)行了類型系統(tǒng)整體的設(shè)計(jì)之后,本文將開始討論接下來的步驟。暫時(shí)不討論UHT的細(xì)節(jié),假設(shè)UHT已經(jīng)分析得到了足夠的類型元數(shù)據(jù)信息,下一步就是利用這個(gè)信息在程序內(nèi)存中構(gòu)建起前文的類型系統(tǒng)結(jié)構(gòu),這個(gè)過程我們稱之為注冊。同一般程序的構(gòu)建流程需要經(jīng)過預(yù)處理、編譯、匯編、鏈接一樣,UE為了在內(nèi)存中模擬構(gòu)建的過程,在概念上也需要以下幾個(gè)階段:生成,收集,注冊,鏈接??傮w的流程比較繁雜,因此本文首先開始介紹第一階段,生成。在生成階段,UHT分析我們的代碼,并生成類型系統(tǒng)的相關(guān)代碼。
Note1:生成的代碼和注冊的過程會因?yàn)镠otReload功能的開啟與否有些不一樣,因此為了最簡化流程闡述,我們先關(guān)閉HotReload,關(guān)閉的方式是在Hello.Build.cs里加上一行:Definitions.Add("WITH_HOT_RELOAD_CTORS=0");
Note2:本文開始及后續(xù)會簡單的介紹一些用到的C++基礎(chǔ)知識,但只是點(diǎn)到為止,不做深入探討。
C++ Static Lazy初始化模式
一種我們常用,也是UE中常用的單件懶惰初始化模式是:
Hello* StaticGetHello(){ static Hello* obj=nullptr; if(!obj) { obj=... } return obj; } 或者Hello& StaticGetHello(){ static Hello obj(...); return obj; }
前者非常簡單,也沒考慮多線程安全,但是在單線程環(huán)境下足夠用了。用指針的原因是,有一些情況,這些對象的生命周期是由別的地方來管理的,比如UE里的GC,因此這里只static化一個(gè)指針。否則的話,還是后者更加簡潔和安全。