基礎(chǔ)知識(shí)-打包項(xiàng)目

你必須先對(duì)虛幻項(xiàng)目進(jìn)行正確打包,之后才能將其發(fā)布給用戶。打包能確保所有代碼和內(nèi)容都為最新且使用正確格式,以便在預(yù)期的目標(biāo)平臺(tái)上運(yùn)行。
打包過程會(huì)涉及以下幾個(gè)步驟。首先,所有項(xiàng)目特定的源代碼會(huì)被編譯。代碼編譯完成后,所有所需的內(nèi)容都會(huì)被轉(zhuǎn)化(即所謂的"烘培")成目標(biāo)平臺(tái)可以使用的格式。然后,編譯后的代碼和經(jīng)過烘焙的內(nèi)容將被打包成一組可發(fā)布的文件,例如安裝程序。
在菜單欄的?文件(File)?菜單中,有一個(gè)名為?打包項(xiàng)目(Package Project)?的選項(xiàng)。該選項(xiàng)包含一個(gè)子菜單,其中列出了所有引擎能支持得平臺(tái),你可以為這些平臺(tái)打包項(xiàng)目。
假如選擇為Android設(shè)備打包,你就會(huì)看到多個(gè)選項(xiàng)。
在打包前,你還可以設(shè)置一些?高級(jí)(Advanced)?選項(xiàng)。
設(shè)置游戲的默認(rèn)地圖
打包游戲前,你首先需要設(shè)置?游戲默認(rèn)地圖,打包好的游戲會(huì)在啟動(dòng)時(shí)首先加載這張地圖。假如你沒有設(shè)置地圖,并且使用的是空白項(xiàng)目,那么打包好的游戲在啟動(dòng)時(shí)只會(huì)顯示一篇漆黑。假如你使用了某張模板地圖,例如第一人稱(First Person)模板或第三人稱(Third Person)模板,那么就會(huì)加載啟動(dòng)地圖。
若要設(shè)置游戲默認(rèn)地圖(Game Default Map),請(qǐng)?jiān)诰庉嬈鞯闹鞑藛螜谥悬c(diǎn)擊?編輯(Edit)> 項(xiàng)目設(shè)置(Project Settings)> 地圖和 模式(Maps & Modes):

創(chuàng)建打包文件
若要為特定平臺(tái)打包項(xiàng)目,請(qǐng)?jiān)诰庉嬈鞯闹鞑藛螜谥悬c(diǎn)擊?文件(File)> 打包項(xiàng)目(Package Project)> [平臺(tái)名稱(PlatformName)]:
Windows

Mac

你會(huì)看到一個(gè)提示你選擇目標(biāo)路徑的對(duì)話框。如果成功完成打包,則此目錄將保存你的打包項(xiàng)目。
確認(rèn)完目標(biāo)路徑后,你就可以開始為所選平臺(tái)打包項(xiàng)目了。由于打包非常耗時(shí),所以整個(gè)過程會(huì)在后臺(tái)執(zhí)行,你可以繼續(xù)使用編輯器。編輯器右下角會(huì)顯示一個(gè)狀態(tài)指示器,提示你打包進(jìn)度。
Windows

Mac

狀態(tài)指示器還有一個(gè)"取消(Cancel)"按鈕來停止打包過程。此外,"顯示日志(Show Log)"鏈接可以用來顯示額外的輸出日志信息,假如你想找出打包的失敗原因,或者捕捉可能揭示潛在漏洞的警告信息,這些日志會(huì)非常有用:
Windows

Mac

一些最重要的日志消息,例如錯(cuò)誤和警告消息,都會(huì)輸出到常規(guī)的消息日志(Message Log)窗口中:
Windows

Mac

假如這些窗口沒有顯示,你只需點(diǎn)擊?窗口(Window)?>?開發(fā)者工具(Developer Tool)?>?輸出日志(Output Log)?/?消息日志(Message Log)?來啟用它們。
發(fā)布
假如你想將iOS或Android游戲發(fā)布到App Store或Google Play Store上,你就要用發(fā)布(Distribution)模式創(chuàng)建打包文件。為此,請(qǐng)點(diǎn)擊?打包(Packaging)?菜單中的?打包設(shè)置(Packaging Settings)?選項(xiàng),然后勾選?發(fā)布(Distribution)?復(fù)選框。
假如是iOS,你需要在Apple的開發(fā)人員網(wǎng)站上創(chuàng)建發(fā)布證書(Distribution Certificate)和移動(dòng)設(shè)備配置(MobileProvision)。請(qǐng)以安裝開發(fā)證書的方式安裝發(fā)布證書,并以"Distro_"為前綴命名發(fā)布配置,緊接著命名另一個(gè)配置(因此你將同時(shí)擁有 `Distro_MyProject.mobileprovision` 和 `MyProject.mobileprovision`)。
假如是Android,你需要?jiǎng)?chuàng)建一個(gè)密鑰來簽署?.apk
?文件,并使用名為?SigningConfig.xml
?的文件向編譯工具傳遞一些信息。該文件位于引擎的安裝目錄(Engine/Build/Android/Java/
)中。假如你編輯了該文件,它就會(huì)影響你的所有項(xiàng)目。然而,你可以將該文件復(fù)制到項(xiàng)目的?Build/Android/
?目錄(無(wú)?Java/
?子目錄),這樣它就只會(huì)影響該項(xiàng)目。你可以在該文件的內(nèi)部找到關(guān)于如何生成密鑰和填寫文件的說明。
高級(jí)設(shè)置
在主菜單欄中點(diǎn)擊?文件(File)> 打包項(xiàng)目(Package Project)> 打包設(shè)置...(Packaging Settings...),或者點(diǎn)擊?編輯(Edit)> 項(xiàng)目設(shè)置(Project Settings)> 打包(Packaging),編輯器會(huì)顯示一些和打包有關(guān)的高級(jí)配置選項(xiàng)。

目前,它們包括:
編譯配置(Build Configuration)
編譯代碼類項(xiàng)目時(shí)使用的編譯配置。若要調(diào)試代碼項(xiàng)目,請(qǐng)選擇"調(diào)試游戲(DebugGame)"。對(duì)于大多數(shù)具有最低限度調(diào)試支持但性能更佳的其他開發(fā),請(qǐng)選擇開發(fā)(Development)。對(duì)于不含調(diào)試信息且不含調(diào)試導(dǎo)向性功能(例如繪制調(diào)試形狀或打印屏幕上的調(diào)試消息)的最終發(fā)布版本,請(qǐng)選擇發(fā)布(Shipping)。
注意,純藍(lán)圖項(xiàng)目沒有用于創(chuàng)建DebugGame編譯的選項(xiàng)。
暫存目錄(Staging Directory)
包含游戲打包后的版本的目錄。當(dāng)你在目標(biāo)目錄選擇中選擇另一個(gè)目錄時(shí),它將自動(dòng)更新。
完整重編譯(Full Rebuild)
是否應(yīng)編譯所有代碼。如果禁用,則只編譯修改過的代碼。這可以加快打包過程。對(duì)于發(fā)布版本,你應(yīng)該始終執(zhí)行完整重編譯,以確保沒有任何內(nèi)容丟失或過時(shí)。此選項(xiàng)默認(rèn)為啟用。
使用Pak文件(Use Pak File)
是否將項(xiàng)目的資產(chǎn)打包為單個(gè)文件或單個(gè)包。如果啟用,所有資產(chǎn)將被放入單個(gè).pak文件,而非復(fù)制所有單個(gè)文件(默認(rèn)為啟用)。如果你的項(xiàng)目使用大量資產(chǎn)文件,則使用Pak文件可以使發(fā)布變得更簡(jiǎn)單,因?yàn)樗鼫p少了需要傳輸?shù)奈募?shù)量。此選項(xiàng)默認(rèn)為禁用。
生成文件塊(Generate Chunks)
是否生成可用于流送安裝的.pak文件塊。
編譯HTTP文件塊安裝數(shù)據(jù)(Build Http Chunk Install Data)
是否為HTTP塊安裝文件生成數(shù)據(jù)。此配置允許在運(yùn)行時(shí)安裝將在Web服務(wù)器上托管的該數(shù)據(jù)。
Http數(shù)據(jù)塊安裝數(shù)據(jù)目錄(Http Chunk Install Data Directory)
它表示數(shù)據(jù)在編譯后的目標(biāo)安裝目錄。
Http數(shù)據(jù)塊安裝數(shù)據(jù)版本(Http Chunk Install Data Version)
它表示HTTP數(shù)據(jù)塊安裝數(shù)據(jù)的版本名稱。
包含先決條件安裝文件(Include Prerequisites Installer)
它指定打包游戲是否包含先決條件的安裝文件,例如可重新發(fā)布的OS組件。
簽名和加密
隨著虛幻引擎4.22的發(fā)布,我們?yōu)樽烂嫫脚_(tái)(Windows、Mac和Linux)集成了行業(yè)標(biāo)準(zhǔn)OpenSSL庫(kù)。
當(dāng)以發(fā)貨產(chǎn)品的形式分發(fā)時(shí),.Pak
?文件可以簽名或加密,通常是為了防止數(shù)據(jù)提取或篡改。要激活、停用或調(diào)整項(xiàng)目上的密碼設(shè)置,請(qǐng)轉(zhuǎn)到?項(xiàng)目設(shè)置(Project Settings)?菜單,找到?加密(Crypto)?部分。

項(xiàng)目設(shè)置(Project Settings)?菜單中的密碼選項(xiàng)。
以下設(shè)置可用于該菜單:
加密Pak INI文件(Encrypt Pak INI Files)
對(duì)項(xiàng)目的?.pak
?文件中所有?.ini
?文件進(jìn)行加密。這將以極小的運(yùn)行時(shí)成本防止輕松挖掘或篡改產(chǎn)品的配置數(shù)據(jù)。
加密Pak索引(Encrypt Pak Index)
加密?.pak
?文件索引,以極小的運(yùn)行時(shí)成本防止UnrealPak打開、查看和解壓縮你產(chǎn)品的?.pak
?文件。
加密UAsset文件(Encrypt UAsset Files)
加密?.pak
?文件中的?.uasset
?文件。這些文件包含關(guān)于內(nèi)部資產(chǎn)的標(biāo)頭信息,但不包含實(shí)際資產(chǎn)數(shù)據(jù)本身。加密這些數(shù)據(jù)為你的數(shù)據(jù)提供了額外的安全性,但是增加了少量運(yùn)行時(shí)成本和數(shù)據(jù)熵,這會(huì)增加補(bǔ)丁的大小。
加密資產(chǎn)(Encrypt Assets)
完全加密?.pak
?中的所有資產(chǎn)。
注意,此設(shè)置會(huì)對(duì)運(yùn)行時(shí)文件I/O性能產(chǎn)生可度量的影響,并增加最終打包數(shù)據(jù)中的熵,從而降低分發(fā)補(bǔ)丁系統(tǒng)的效率。
啟用Pak簽名(Enable Pak Signing)
激活或禁用 .pak 文件簽名。
此外,可以設(shè)置或清除用于簽名或加密的密鑰。
內(nèi)容烘焙
作為一名開發(fā)人員,在迭代新的或修改過的游戲內(nèi)容時(shí),你可能并不總是希望經(jīng)歷將所有內(nèi)容都打包到Staging Directory并從此處運(yùn)行的漫長(zhǎng)過程。因此,只需點(diǎn)擊?文件(File)> 烘焙內(nèi)容(Cook Content)> [平臺(tái)名稱(PlatformName)],即可為特定目標(biāo)平臺(tái)烘焙內(nèi)容,而無(wú)需打包。
注意,該功能將更新項(xiàng)目本地開發(fā)人員工作區(qū)中的內(nèi)容,并且不會(huì)將任何資產(chǎn)復(fù)制到暫存目錄。你可以直接從本地開發(fā)人員工作區(qū)運(yùn)行游戲,以實(shí)現(xiàn)快速迭代。
優(yōu)化加載時(shí)間
較短的加載時(shí)間對(duì)于開放世界場(chǎng)景游戲而言至關(guān)重要,而且對(duì)于任何類型的游戲來說也非常重要。虛幻引擎提供了幾種方法來優(yōu)化項(xiàng)目在打包過程中的加載時(shí)間。以下是縮短游戲加載時(shí)間的一些推薦做法。
使用事件驅(qū)動(dòng)加載器(Event Driven Loader,EDL)和異步加載線程(Asynchronous Loading Thread,ALT)
默認(rèn)情況下,異步加載線程(Asynchronous Loading Thread)(ALT)是關(guān)閉的,但是可以在引擎(Engine)>流送(Streaming)部分下的項(xiàng)目設(shè)置(Project Settings)菜單中打開。對(duì)于修改過的引擎,可能需要進(jìn)行一些調(diào)整,但一般來說,ALT應(yīng)該會(huì)將加載速度提高一倍,包括具有"預(yù)先"加載時(shí)間的游戲和持續(xù)流送數(shù)據(jù)的游戲。ALT的工作方式是在兩個(gè)獨(dú)立的線程上同時(shí)運(yùn)行序列化和后加載代碼,因此,它增加了一項(xiàng)要求,即游戲代碼中的"UObject"類構(gòu)造函數(shù)、"PostInitProperties"函數(shù)和"Serialize"函數(shù)必須具有線程安全性。激活A(yù)LT后,ALT會(huì)將加載速度提高一倍。
默認(rèn)情況下激活?事件驅(qū)動(dòng)加載程序(Event-Driven Loader),但是可以在"引擎(Engine)>流送(Streaming)"部分下的"項(xiàng)目設(shè)置(Project Settings)"菜單中禁用。對(duì)于大多數(shù)項(xiàng)目,EDL會(huì)將加載時(shí)間減半。EDL是穩(wěn)定的,可以向后移植到舊版本的虛幻引擎,也可以針對(duì)修改過或自定義的引擎版本進(jìn)行調(diào)整。

壓縮.pak文件
要在項(xiàng)目中使用?
.pak
?文件壓縮,打開"項(xiàng)目設(shè)置(Project Settings)"并找到"打包(Packaging)"部分。在此部分,打開"打包(Packaging)"標(biāo)題的高級(jí)部分,并選中出現(xiàn)的標(biāo)有"創(chuàng)建壓縮烘焙包(Create compressed cooked packages)"的復(fù)選框。大多數(shù)平臺(tái)不提供自動(dòng)壓縮,且壓縮你的?
.pak
?文件將減少加載時(shí)間,但有一些特殊情況需要考慮:
Steam
Steam在用戶下載文件時(shí)壓縮文件,所以初始下載時(shí)間不會(huì)受到游戲正在壓縮的.pak文件的影響。然而,Steam的差分補(bǔ)丁系統(tǒng)在未壓縮文件時(shí)會(huì)運(yùn)行得更好。壓縮的.pak文件可以節(jié)省在客戶系統(tǒng)上的空間,但是在打補(bǔ)丁時(shí)需要更長(zhǎng)的時(shí)間來下載。
Oculus
不啟用?.pak
?文件的壓縮。Oculus補(bǔ)丁系統(tǒng)無(wú)法正確處理壓縮后的?.pak
?文件。此外,壓縮?.pak
?文件也不會(huì)減小文件大小。

選中此框以啟用.pak文件中的壓縮。
對(duì)pak文件排序
井井有條的?.pak
?文件對(duì)于減少加載時(shí)間至關(guān)重要。為了幫助你以最佳方式對(duì)?.pak
?文件進(jìn)行排序,UE4提供了一組工具來發(fā)現(xiàn)所需數(shù)據(jù)資產(chǎn)的順序,并編譯更快加載的包。從概念上講,此過程類似于基于配置文件的優(yōu)化。按照該方法對(duì)我們的?.pak
?文件進(jìn)行排序:
使用命令行選項(xiàng)?
-fileopenlog
?編譯并運(yùn)行打包游戲,這將導(dǎo)致引擎記錄打開文件的順序。測(cè)試游戲的所有主要方面。加載每個(gè)關(guān)卡、每個(gè)可操作角色、每個(gè)武器、每個(gè)載具等等。加載所有內(nèi)容后,退出游戲。
在部署的文件中,將有一個(gè)名為"GameOpenOrder.log"的文件,其中包含優(yōu)化.pak文件順序所需的信息。例如,在Windows各版本上,你將在"WindowsNoEditor/(YourGame)/Build/WindowsNoEditor/FileOpenOrder/"中找到該文件。將該文件復(fù)制到開發(fā)目錄"/Build/WindowsNoEditor/FileOpenOrder/"路徑。
日志文件就緒后,重新編譯?
.pak
?文件。該?.pak
?和未來生成的所有?.pak
?文件都將使用日志文件中規(guī)定的文件順序。
在生產(chǎn)環(huán)境中,日志文件應(yīng)該檢入源碼控制,并定期更新新的?-fileopenlog
?運(yùn)行結(jié)果,包括游戲準(zhǔn)備發(fā)行時(shí)的最后一次運(yùn)行。