編譯
上面基本的術(shù)語(yǔ)已經(jīng)介紹完了,下面我們進(jìn)入來(lái)進(jìn)入藍(lán)圖編譯過(guò)程分析。藍(lán)圖的編譯過(guò)程都在FKismetCompilerContext::Compile()函數(shù)中。它根據(jù)編譯的類(lèi)型不同(上文編譯選項(xiàng)中提到的只編譯Skeleton、只生成字節(jié)碼、只生成cpp代碼等等)會(huì)走不同的分支。我們這里以完全編譯來(lái)講解。此處為大概的流程,若想看詳細(xì)的流程,請(qǐng)參照流程圖以及代碼。
清除類(lèi)
類(lèi)是就地編譯的,這意味著同一個(gè)UBlueprintGeneratedClass在每次編譯的時(shí)候都會(huì)被清理,并且會(huì)重復(fù)利用,這樣指向這個(gè)類(lèi)的指針就不用修復(fù)了。CleanAndSanitizeClass()把屬性和函數(shù)放到臨時(shí)包的一個(gè)垃圾(trash)類(lèi)里面,然后清除類(lèi)中的所有數(shù)據(jù)。
創(chuàng)建類(lèi)的屬性
CreateClassVariablesFromBlueprint()函數(shù)遍歷藍(lán)圖的NewVariables數(shù)組,也包括構(gòu)造腳本、Timeline等地方來(lái)找到該類(lèi)需要的所有屬性,然后創(chuàng)建UProperties。
創(chuàng)建函數(shù)列表
通過(guò)處理事件圖表(Event graph)、常規(guī)的函數(shù)圖表、代理、以及接口中來(lái)創(chuàng)建函數(shù)。
處理事件圖表
CreateAndProcessUberGraph()函數(shù)用來(lái)處理事件圖表。它把所有的事件圖表拷貝到一個(gè)大的圖中,這個(gè)時(shí)候節(jié)點(diǎn)有機(jī)會(huì)去做展開(kāi)操作(expand,如果它需要的話(huà))。然后會(huì)為圖中的每一個(gè)事件節(jié)點(diǎn)創(chuàng)建一個(gè)函數(shù)樁(stub),最終會(huì)為當(dāng)前的事件圖表創(chuàng)建一個(gè)FKismetFunctionContext,用于把整個(gè)事件圖表當(dāng)作一個(gè)函數(shù)來(lái)處理。
處理函數(shù)圖表
常規(guī)函數(shù)圖表的處理是通過(guò)ProcessOneFunctionGraph()函數(shù)來(lái)完成的,它會(huì)把圖中的每一個(gè)節(jié)點(diǎn)拷貝到另外一個(gè)節(jié)點(diǎn)中去,這個(gè)時(shí)候每個(gè)節(jié)點(diǎn)有機(jī)會(huì)展開(kāi)(expand),最后會(huì)為每一個(gè)函數(shù)創(chuàng)建一個(gè)FKismetFunctionContext,用來(lái)后面對(duì)該函數(shù)的編譯工作。
預(yù)編譯函數(shù)
函數(shù)的預(yù)編譯是通過(guò)為每一個(gè)FKismetFunctionContext調(diào)用PrecompileFunction()來(lái)實(shí)現(xiàn)的,這個(gè)函數(shù)主要做以下操作:
確定執(zhí)行順序并計(jì)算數(shù)據(jù)依賴(lài)。
去除那些沒(méi)有連接的或者無(wú)數(shù)據(jù)依賴(lài)的節(jié)點(diǎn)。
為每一個(gè)剩下的運(yùn)行每一個(gè)節(jié)點(diǎn)處理器(FNodeHandlingFunctor)的RegisterNets()函數(shù),它會(huì)為函數(shù)中的值創(chuàng)建FBPTerminal。
創(chuàng)建UFunction對(duì)象和相關(guān)的屬性。
綁定和鏈接類(lèi)