你想要啊?想要你就說(shuō)出來(lái)嘛,你不說(shuō)我怎么知道你想要呢?

引言

上文講到了UE的類(lèi)型系統(tǒng)結(jié)構(gòu),以及UHT分析源碼的一些宏標(biāo)記設(shè)定。在已經(jīng)進(jìn)行了類(lèi)型系統(tǒng)整體的設(shè)計(jì)之后,本文將開(kāi)始討論接下來(lái)的步驟。暫時(shí)不討論UHT的細(xì)節(jié),假設(shè)UHT已經(jīng)分析得到了足夠的類(lèi)型元數(shù)據(jù)信息,下一步就是利用這個(gè)信息在程序內(nèi)存中構(gòu)建起前文的類(lèi)型系統(tǒng)結(jié)構(gòu),這個(gè)過(guò)程我們稱(chēng)之為注冊(cè)。同一般程序的構(gòu)建流程需要經(jīng)過(guò)預(yù)處理、編譯、匯編、鏈接一樣,UE為了在內(nèi)存中模擬構(gòu)建的過(guò)程,在概念上也需要以下幾個(gè)階段:生成,收集,注冊(cè),鏈接。總體的流程比較繁雜,因此本文首先開(kāi)始介紹第一階段,生成。在生成階段,UHT分析我們的代碼,并生成類(lèi)型系統(tǒng)的相關(guān)代碼。

Note1:生成的代碼和注冊(cè)的過(guò)程會(huì)因?yàn)镠otReload功能的開(kāi)啟與否有些不一樣,因此為了最簡(jiǎn)化流程闡述,我們先關(guān)閉HotReload,關(guān)閉的方式是在Hello.Build.cs里加上一行:Definitions.Add("WITH_HOT_RELOAD_CTORS=0");
Note2:本文開(kāi)始及后續(xù)會(huì)簡(jiǎn)單的介紹一些用到的C++基礎(chǔ)知識(shí),但只是點(diǎn)到為止,不做深入探討。

C++ Static Lazy初始化模式

一種我們常用,也是UE中常用的單件懶惰初始化模式是:

Hello* StaticGetHello(){    static Hello* obj=nullptr;    if(!obj)
    {
        obj=...
    }    return obj;
}
或者Hello& StaticGetHello(){    static Hello obj(...);    return obj;
}

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