編譯
上面基本的術語已經(jīng)介紹完了,下面我們進入來進入藍圖編譯過程分析。藍圖的編譯過程都在FKismetCompilerContext::Compile()函數(shù)中。它根據(jù)編譯的類型不同(上文編譯選項中提到的只編譯Skeleton、只生成字節(jié)碼、只生成cpp代碼等等)會走不同的分支。我們這里以完全編譯來講解。此處為大概的流程,若想看詳細的流程,請參照流程圖以及代碼。
清除類
類是就地編譯的,這意味著同一個UBlueprintGeneratedClass在每次編譯的時候都會被清理,并且會重復利用,這樣指向這個類的指針就不用修復了。CleanAndSanitizeClass()把屬性和函數(shù)放到臨時包的一個垃圾(trash)類里面,然后清除類中的所有數(shù)據(jù)。
創(chuàng)建類的屬性
CreateClassVariablesFromBlueprint()函數(shù)遍歷藍圖的NewVariables數(shù)組,也包括構造腳本、Timeline等地方來找到該類需要的所有屬性,然后創(chuàng)建UProperties。
創(chuàng)建函數(shù)列表
通過處理事件圖表(Event graph)、常規(guī)的函數(shù)圖表、代理、以及接口中來創(chuàng)建函數(shù)。
處理事件圖表
CreateAndProcessUberGraph()函數(shù)用來處理事件圖表。它把所有的事件圖表拷貝到一個大的圖中,這個時候節(jié)點有機會去做展開操作(expand,如果它需要的話)。然后會為圖中的每一個事件節(jié)點創(chuàng)建一個函數(shù)樁(stub),最終會為當前的事件圖表創(chuàng)建一個FKismetFunctionContext,用于把整個事件圖表當作一個函數(shù)來處理。
處理函數(shù)圖表
常規(guī)函數(shù)圖表的處理是通過ProcessOneFunctionGraph()函數(shù)來完成的,它會把圖中的每一個節(jié)點拷貝到另外一個節(jié)點中去,這個時候每個節(jié)點有機會展開(expand),最后會為每一個函數(shù)創(chuàng)建一個FKismetFunctionContext,用來后面對該函數(shù)的編譯工作。
預編譯函數(shù)
函數(shù)的預編譯是通過為每一個FKismetFunctionContext調(diào)用PrecompileFunction()來實現(xiàn)的,這個函數(shù)主要做以下操作:
確定執(zhí)行順序并計算數(shù)據(jù)依賴。
去除那些沒有連接的或者無數(shù)據(jù)依賴的節(jié)點。
為每一個剩下的運行每一個節(jié)點處理器(FNodeHandlingFunctor)的RegisterNets()函數(shù),它會為函數(shù)中的值創(chuàng)建FBPTerminal。
創(chuàng)建UFunction對象和相關的屬性。
綁定和鏈接類
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現(xiàn)JSON轉Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應用分析 2017-07-26
- 集合結合數(shù)據(jù)結構來看看(二) 2017-07-26