ue4 build configuration的解釋


ue4的build系統,繼承並發展了3代的一如既往的復雜。。

 

一、每個configuration由兩部份組成:【(性能)模式】+【(內容)組成】

模式有:Debug,DebugGame,Development,Shipping,Test

  Debug:引擎和游戲項目都是debug編譯,最適合調試,不做任何優化,運行速度也是最慢的

  DebugGame:只有游戲項目用debug,引擎有適度優化,調試時某些變量看不到了

  Development:引擎和游戲項目都優化了,調試時某些變量看不到。運行速度適中,一般開發時都用這個,特別是編輯器也是用的這種模式。

  Shipping:發行版,極致優化,估計調試信息都沒了。

  Test:包含額外的測試代碼。

組成有:空(Game),Client,Server,Editor

  空:實際意義是【未指定】,也就是默認的意思(而不是什么都沒有的空),包含客戶端和服務器代碼,不包含編輯器。

  Client:只包含客戶端

  Server:只包含服務器

  Editor:包含所有三項。

 

注意:solution層級的“空”對應到project層級的名字是"Game",也就是默認為游戲(而非編輯器)的意思。

所以Debug_Game和DebugGame完全不是一回事,后者實際只是DebugGame_(空)的簡化。

 

二、用launcher下載的預編譯版Editor建立的工程,和用源碼自編譯版Editor建立的工程,結構會不一樣。

預編譯版Editor的工程只有少數幾種configuration,且引擎工程僅用來閱讀和調試,不能編譯。

源碼版工程分兩種情況,1是引擎(如上圖),包含了全部【模式+組成】的configuration組合,並且在構建時也會編譯引擎

2是自己的工程,模式是全的,但組成只有Game和Editor兩種,也就是不分純客戶端和純服務器了

 

三、一些實現細節:

1、實際的編譯是通過命令:

D:\prg\UnrealEngine\Engine\Build\BatchFiles\Build.bat UE4Client Win64 Debug -waitmutex

D:\prg\UnrealEngine\Engine\Build\BatchFiles\Build.bat usbp Win64 Debug "$(SolutionDir)$(ProjectName).uproject" -waitmutex

前者是編引擎,后者是編自己的工程,bat里再調用:

..\..\Engine\Binaries\DotNET\UnrealBuildTool.exe %* -DEPLOY

參數意義如下:

REM %1 is the game name
REM %2 is the platform name
REM %3 is the configuration name

可以對比不同的組合:

Debug_Game:D:\prg\UnrealEngine\Engine\Build\BatchFiles\Build.bat UE4Game Win64 Debug -waitmutex

Debug_Editor:D:\prg\UnrealEngine\Engine\Build\BatchFiles\Build.bat UE4Editor Win64 Debug -waitmutex

DebugGame_Game:D:\prg\UnrealEngine\Engine\Build\BatchFiles\Build.bat UE4Game Win64 DebugGame -waitmutex

 

2、第1參數game name,表示的是一個UEBuildTarget,即構建目標,所謂目標也就是exe、dll這樣的文件,畢竟構建來構建去,最終目的就是生成這些可執行文件。

UEBuildTarget總共有5類,分別由5個子類表示,正好是上面所說的組成里的4類,再加1個叫Program的類(各種命令行工具)

一個UEBuildTarget里包含兩類信息,一是包含的模塊UEBuildModule,二是構建規則,規則又分兩類,即TargetRules和ModuleRules

其中TargetRules就是各相應工程目錄下對應*.Target.cs文件描述,比如在Engine/Source目錄下,就有4個文件分別對應各自的name,UE4Game/UE4Editor/UE4Client/UE4Server.Target.cs 

而ModuleRules則是各*.Build.cs文件

簡單來說,一個ModuleRules定義了一個具體的模塊文件(exe/dll)怎么構建,比如要編譯哪些源文件

而一個TargetRules定義了一個抽象的Target,由哪些模塊組合而成,比如說一個Editor,實際對應着一個exe和一堆dll

 

3、這些不同的UEBuildTarget類型,最直觀的差別就是它們分別定義了各自的預處理器宏

如UEBuildEditor里:

OutCPPEnvironmentConfiguration.Definitions.Add("UE_EDITOR=1");

就添加了UE_EDITOR定義,這就會導致代碼里大段大段被#if UE_EDITOR擴起來的地方被編譯

而在代表純游戲的UEBuildGame里,就不會編譯那些代碼,以減少體積和開銷。

 

四、新建一個項目,實際生成兩樣東西:

1、game:是一個exe,而且以工程名命名,所有靜態庫全鏈接在一起,基本沒有dll依賴,都看不出跟引擎有什么關聯

2、editor:是一個dll,但是名字叫UE4Editor-xxxx.dll,實際上是做為UE4Editor.exe的一個插件,啟動的時候運行的是引擎的exe


免責聲明!

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



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