虛幻4藍圖編譯剖析(二)


虛幻4編譯相關術語和類圖

虛幻引擎中的藍圖編譯跟常規的程序編譯多少是有一些不同的地方,但是基本原理是相通的。我們以普通的類藍圖為例,一個類中包含多個圖,每個圖中又可以包含一些子圖。一個圖會包含很多的節點(UEdGraphNode),每個節點可以包含若干引腳(UEdGraphPin)用來連接兩個節點。節點又分為執行節點和純節點(Pure node,上面沒有執行引腳)。還有一個模式類(UEdGraphSchema)用於驗證語法是否正確等。類圖如下所示:

圖(UEdGraph)

虛幻4中許多其它的也是使用圖來實現的,所以它也有許多的派生類,比如UAIGraph、UAnimationGraph、UAnimationStateMachineGraph、UMaterialGraph等等。類圖如下所示:

節點(UEdGraphNode)

一個有向無環圖是由無數節點組成的,這個節點就是UEdGraphNode,因為上面提到的圖中有支持各種功能的圖,所以也就有各種各樣的節點,下面我們只摘取一些節點類型,由於我們重點是講解藍圖編譯,所以我們把主要精力放在UK2Node上面,這個節點是所有藍圖節點的基類。類圖所示:

引腳(UEdGraphPin)

每個節點上可以有多個節點,輸入、輸出節點以及參數引腳等等,這些引腳用於記錄跟哪些引腳相連、類型、默認值等。

 

模式(UEdGraphSchema)

用於語法檢查(看兩個引腳是否可以相連、嘗試連接引腳)等功能,如上面所有因為有多種圖所以就需要多種模式。藍圖使用的是UEdGraphSchema_K2,動畫以及UMG會有自己的Schema。類圖如下所示:

FKismetCompilerContext

真正執行編譯工作的類,每編譯一次就會生成一個新的實例,用來存儲編譯類的引用以及藍圖等。整個編譯過程又分為好多步,是在Compile()函數里面做的。

FKismetFunctionContext

持有編譯一個函數的所有信息,包括指向相關圖(UEdGraph)的引用、屬性以及生成的函數等。

FBlueprintCompiledStatement

編譯過程中的單位工作。編譯把節點翻譯成一系列編譯的語句,然后編譯器后端會把它編譯成字節碼。例如變量賦值、goto、調用(call)等。

FBPTerminal

圖中的一個終結點(字面量、常量、或者變量引用)。每一個數據引腳都跟其中的一個相關聯。你可以自己在NodeHandlingFunctor里面來生成自己的項,用來存儲變量、中間結果等。

FNodeHandlingFunctor

用來處理一類節點編譯的幫助類,包含用於注冊引腳連接的函數(RegisterNets()),以及生成編譯語句(FBlueprintCompiledStatement)。通過UK2Node::CreateNodeHandler()函數來創建。如下類圖只列舉了幾個HandlerFunctor。

FBlueprintCompileReinstancer

在編譯基本完成的時候,由於類可能已經改變了大小或者有新的屬性被添加或刪除了,那么編譯器需要重新實例化我們剛剛編譯類生成的對象實例,生成一個新的,然后使用CopyPropertiesForUnrelatedObjects()函數來把舊的實例中的數據拷貝到新的實例中去。

 

FKismetCompilerOptions

編譯選項,用於指定編譯時的設置,包括編譯類型(只編譯Skeleton, 全部編譯、只生成字節碼、只生成cpp)等。

 

Skeleton Class

Skeleton類如其名字定義是一個骨架類,在添加成員變量或者成員函數時都會重新重新(它里面沒有代碼和自動生成的隱藏變量)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM