Unreal2初步分析(u3的底層架構(gòu)基本不變,跟u2相同)
Unreal2打造一套和腳本緊密結(jié)合的引擎
總概:
具體過(guò)程:
一。生成類信息體PrivateStaticClass:
dll裝載時(shí):
dll各類全局靜態(tài)類信息對(duì)象PrivateStaticClass的構(gòu)造函數(shù)中產(chǎn)生對(duì)應(yīng)類的信息(對(duì)應(yīng)包名,分配函數(shù),靜態(tài)構(gòu)造函數(shù)),
各對(duì)象存入GAutoRegister鏈表.
二。初始各類信息體:
appInit()調(diào)用時(shí):
1. 遍歷GAutoRegister鏈表, 注冊(cè)每一個(gè)靜態(tài)類信息對(duì)象, 使用對(duì)應(yīng)包名(所在dll)為其產(chǎn)生對(duì)應(yīng)UPackage對(duì)象,獲得對(duì)應(yīng)dll句柄。
2. 并構(gòu)造類成員Defaults缺省對(duì)象,將基類全局靜態(tài)對(duì)象中成員default數(shù)據(jù)拷給它(所謂繼承), 并用其作為this調(diào)用類對(duì)應(yīng)靜態(tài)構(gòu)造函數(shù),
3. 可在靜態(tài)構(gòu)造函數(shù)中注冊(cè)類成員變量,注冊(cè)的變量將作為原PrivateStaticClass對(duì)象的children結(jié)點(diǎn).
5. 接著遍歷全局靜態(tài)對(duì)象的Children,將它們歸類放在PropertyLink和ConfigLink鏈中(其中PropertyLink是全部所有屬性)
6. 再來(lái)就是可通過(guò)config裝載它自己的屬性初始值到Default對(duì)象中。
三。 引擎初始:
1. 先初始引擎類:
EngineClass = UObject::StaticLoadClass( UGameEngine::StaticClass(), NULL, TEXT("ini:Engine.Engine.GameEngine"), NULL, LOAD_NoFail, NULL );
a. 為其產(chǎn)生ULinkerLoad:
在ULinkerLoad構(gòu)造函數(shù)中:
1). 打開(kāi)對(duì)應(yīng)的包文件Engine.u, 并將它的LinkerRoot指向該類對(duì)應(yīng)的包對(duì)象,
2). 從文件中讀取Summary,名字表,導(dǎo)入導(dǎo)出表,最后將此ULinkerLoad對(duì)象存入GObjLoaders列表中,
3). 再通過(guò) VerifyImport(i)來(lái)遍歷導(dǎo)入表檢查每一個(gè)導(dǎo)入項(xiàng)的有效性,
下面具體分析a. 步驟中VerifyImport(i)的內(nèi)容:
每個(gè)導(dǎo)入表記錄了在哪個(gè)包的名稱,對(duì)應(yīng)哪個(gè)類的名稱,這個(gè)校驗(yàn)首先查找創(chuàng)建對(duì)應(yīng)包對(duì)象(存dll句柄)以及對(duì)應(yīng)ULinkerLoad對(duì)象(存包對(duì)應(yīng)的.u文件句柄)
而在為導(dǎo)入項(xiàng)產(chǎn)生ULinkerLoad的構(gòu)造函數(shù)中又回到了 1). 的步驟中,如此循環(huán)不停地裝載所有依賴的dll及對(duì)應(yīng)的.u文件。
b. 通過(guò)ULinkerLoad對(duì)象來(lái)產(chǎn)生對(duì)應(yīng)的GameEngine對(duì)象
Linker->Create()即是通過(guò).u文件讀入的導(dǎo)入類來(lái)產(chǎn)生該對(duì)象(同時(shí)讓SuperField指向產(chǎn)生根結(jié)點(diǎn))并加到GObjLoaded鏈表中,如果產(chǎn)生失敗,則
轉(zhuǎn)換Result = StaticFindObject( ObjectClass, InOuter, InName );來(lái)通過(guò)dll中的類來(lái)產(chǎn)生它。
c. EndLoad()
遍歷GObjLoaded鏈表,裝載用Object->_LinkerIndex取出對(duì)應(yīng)FObjectExport,將其屬性內(nèi)容讀入該對(duì)象內(nèi)容。
[注意]是先從基對(duì)象SuperField->Preload()開(kāi)始再到其派生類逐步讀入。另外在UStruct的Serialize函數(shù)中會(huì)裝載children,
這又會(huì)依賴其它導(dǎo)入導(dǎo)出庫(kù),因此會(huì)重復(fù)多次觸發(fā)導(dǎo)入導(dǎo)出相關(guān)處理。
另外如果是Native類,就不會(huì)通過(guò)link的create,而是通過(guò)StaticFindObject返回一個(gè)
2. 再產(chǎn)生引擎實(shí)例:
UEngine* Engine = ConstructObject<UEngine>( EngineClass );
這是使用第1步生成的EngineClass(即GameEngine對(duì)象)來(lái)創(chuàng)建一個(gè)新的名為GameEngine0的對(duì)象.(這會(huì)將GameEngine對(duì)象的內(nèi)容克隆給GameEngine0)
然后再調(diào)用類的構(gòu)造函數(shù)UGameEngine::UGameEngine()來(lái)初始成員。
3. 初始引擎:
Engine->Init();
遍歷GObjObjects鏈表,進(jìn)行加載
四。關(guān)于.u文件的生成:
由uccdepend轉(zhuǎn)調(diào)用ucc.exe來(lái)遍歷查找所有packages來(lái)讀取uc腳本生成。
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/flipcode/archive/2010/04/06/5453730.aspx
posted on 2010-11-03 23:13
flipcode 閱讀(338)
評(píng)論(0) 編輯 收藏 引用