大家好,今天是跟大家分享Unreal如何加速shader編譯?
如果你很熟悉在虛幻引擎中工作的話,你就會看到右下角那個閃爍的小條不斷地通知你引擎正在compiling shaders編譯着色器。根據你在項目中實現材質的方式,你可能有數百或數十萬個虛幻引擎認為需要編譯的着色器。如果你的機器配置比較高,那可能影響不是很大,但是如果你機器配置低端,那估計每次都得幾個小時來編譯。
在虛幻編輯器內部和外部,你都可以嘗試多種技巧,它們可以顯著減少編譯着色器所需的時間,或者減少首先需要編譯的着色器數量。
這些技術都經過虛幻引擎社區的嘗試和測試,范圍從改進處理material pipeline的方式、更改系統賦予虛幻引擎編譯工具的優先級,到簡單地升級你正在使用的硬件。然而,在我們進入所有這些之前,我們需要知道我們正在處理什么。shader編譯可能不方便,但它是虛幻引擎圖形管道的重要組成部分。
1、什么是着色器
在 Unreal(以及一般的計算機圖形學)中,着色器shader是一系列詳細說明對象如何在屏幕上以視覺方式呈現的特定指令。當它繪制你的游戲世界時,着色器將通知引擎關於每一幀的最終像素值。值得注意的是,這項技術在圖形編程中無處不在,而不僅僅是在游戲開發中,而且它本身就是一門完整的學科。
着色器在復雜性和相關性能成本方面的變化很大。以下是可能受着色器影響的游戲最終外觀的一些常見方面,特別是在虛幻引擎中。
顏色
半透明
你的對象如何響應光和陰影(包括反射、鏡面反射和自陰影)
3D 多邊形對象頂點的世界位置
Tessellation細分(多邊形網格的動態細分以創建更密集的幾何體)
顏色分級(后處理post-processing)
注意:着色器shader(在技術上)不是material
我們在網上可能會遇到術語“shader”與術語“material”可互換使用。這在以虛幻引擎為中心的論壇和留言板中尤為普遍。這有時會導致混淆,因為雖然它們絕對不是一回事,但在 Unreal 中,這條線有些模糊。
你可以將material視為開發人員輸入着色器以獲得所需結果的輸入。分配紋理,設置顏色值 - 定義着色器隨后用於生成輸出的參數。
在 Unreal 中,它變得有點混亂,因為當你使用其基於節點的材質編輯器時,你同時制作了material和shader。在編輯器中,每個節點代表一個HLSL 着色器代碼模塊,可以將它們鏈接在一起以創建自定義材質/着色器組合。它既定義了着色器指令,又設置了它將使用的參數。這就是為什么你會看到開發人員使用“材質material”和“着色器shader”等術語來表示相同的意思。
就我們的目的而言,要記住的最重要的事情是一種材質material將生成多個着色器shader。這些被稱為“permutations”,我們將在下一節中更詳細地介紹它們。
2、Compile Shader——為么會有這么多
當 Unreal 編譯着色器時,它會使用你在材質編輯器中設置的組合模塊化指令集,並生成引擎可用於渲染幀的 HLSL 着色器。這當然不是那么簡單,只是籠統的說。
但是,你肯定會注意到,虛幻引擎編譯的着色器遠遠多於項目中現有的材質。這是因為對於每種材質,Unreal 都會為每個潛在的用例編譯一個着色器——而且可能有很多。你可以在“材質編輯器”中設置面板的“Usage”部分中找到一些常用的。
這些“Used with,,,”復選框中的每一個都代表(至少)一個額外的着色器,需要為你的材質編譯以支持該功能。
如果你使用的材質依賴於switch開關(即static和quality switch -switch參數在運行時編譯時不同),對於每種可能的變化,基礎材質的着色器permutations數量加倍。
Landscape可能特別麻煩,因為每個component(網格上的方形部分)也會產生獨特的permutations。對於大型世界,僅此一項就可以輕松使着色器的數量攀升至數萬個。
好的!現在我們知道我們要面對的是什么,讓我們看看如何減少引擎需要花費在着色器編譯上的時間。
3、檢查material的使用設置
創建所有新material時,都會默認開啟“Automatically Set Usage in Editor”。這是一件好事。這意味着引擎只會創建你需要的着色器permutations。比如如果你的材質不需要與spline meshes一起使用,則不需要創建着色器permutations來支持該功能。
但是,如果選中這些框,並且將其設置為 true 后,引擎將不會為你取消選中它們。如果你決定不再需要像Niagara 這樣的特定用途的permutations,則必須手動打開並取消選中該框。
如果你有一些特別貴的材質,尤其是本身具有大量permutations的主材質,則需要快速查看一下你的材質的使用設置,並確保你只啟用了你需要的功能。
4、減少項目設置中的permutations
在你的項目設置中,rendering那一欄有兩個部分,稱為Shader Permutation Reduction 和Mobile Shader Permutation Reduction 。這是一系列復選框,可讓你批量禁用不需要的引擎功能的着色器permutations。這可以顯着減少你需要編譯的着色器數量。
在此處進行任何更改都需要重新啟動編輯器,並且不要忘記將鼠標懸停在工具提示上。你需要確保沒有使用依賴於這些着色器的功能,否則 Unreal 會大驚小怪。
5、降低材質的復雜性
根據材質的復雜性,某些着色器的編譯時間會比其他着色器更長。比如幾十個features和由開關控制若干分支的變化的主材質,將創建了很多 permutations。與由更簡單的設置(如unlit material)生成的着色器相比,每個permutations都需要更長的時間來編譯。
有時為了讓你的游戲中擁有令人驚嘆的效果不可避免要很多功能,但請確保你充分利用了每個material。如果你有不使用的功能,請將其刪除並節省一些時間。
6、添加更多的Shader Compile Worker
當虛幻引擎運行編譯着色器的時,編輯器本身實際上並沒有做太多的跑腿工作。這取決於一個稱為“Shader Compile Worker”的幕后運行的較小程序的實例。
如果你使用的是 Windows,你將能夠在任務管理器中看到它們。如果你的 CPU 有多個線程,你可能能夠支持比Unreal默認創建的更多的並發着色器編譯工作器。你可以導航到Engine\Config\BaseEngine.ini並編輯以下行來添加更多線程,其中 x 是線程數。
NumUnusedShaderCompilingThreads=x
這是一個相對安全的設置。如果你將未使用的着色器編譯線程數設置得太高,Unreal 會自動降低它。你可以盡可能地設置它,它不會使用不存在的線程。
7、給Shader Compile Worker設置更高的優先級
抱歉 Mac 和 Linux 用戶,這是一個僅限 Windows 的技巧。可能其他操作系統也有類似的功能,但是需要研究一下。
在任務管理器的“Details”中,你會看到默認情況下,與大多數進程一樣,你的着色器編譯工作器的優先級設置設置為“normal”。將它們全部設置為“above normal”將導致 Windows 將更多系統資源分配給它們,用來加快它們通過着色器隊列的速度。
你可能會想要直接設置為“High”,但是我建議不要這樣做。這可以使它們與保持計算機正常運行所需的其他程序具有同等的優先級,但是可能導致大量速度減慢並可能使編輯器和/或計算機崩潰。
8、最小化編輯器開銷
虛幻引擎的着色器編譯器使用異步流系統,它會將要編譯的着色器排隊,並在你工作時逐一處理它們。這有時很有用,因為它允許開發不間斷地繼續,但是如果你希望你的着色器編譯得盡可能快並且不礙事,它就沒有那么有用了。
虛幻編輯器本身會對你的系統資源造成很大負擔,即使你什么都不做。這意味着你的 CPU 的很大一部分(有時高達 80%,即使在空閑時也是如此!)只是忙於管理編輯器。這並沒有為着Shader Compile Worker留下太多空間來做他們的事情。
確保編輯器不是活動窗口會有所幫助,因為 Unreal 在未聚焦時會自動使用較少的系統資源(如果你選擇simulating your game,你會注意到 fps 會顯着下降)。
如果你想繼續工作,你仍然可以通過按Ctrl+R關閉視口中的實時預覽來節省一些時間。
我用這種技術得到了有好有壞的結果,但其他人發現將編輯器的優先級設置為“低”也有很大幫助。
9、升級硬件
如果你已經完成了所有其他工作,但仍然對着色器隊列的運行速度不滿意,那么可能是時候考慮升級你的硬件了。
在運行時,着色器是使用計算機的 GPU 或圖形處理單元計算的——但這不是我們想要的。着色器編譯幾乎完全依賴於你的中央處理單元或 CPU。如果你想升級你的裝備,那就先升級處理器或者CPU吧。(雖然也強烈推薦使用 SSD!)
Compiler Booster
這不是一個真正提高編譯速度的方法或者技巧(這可能是一個廣告)。如果你前往 Unreal Marketplace,你會發現一個名為Compiler Booster的引擎插件,由Corentin Guillaum 制作。
Compiler booster 提供了一個易於訪問的界面,可讓你從編輯器中設置 Shader Compile 工作線程優先級。這包括一個復選框,啟用后,它將在每個工作人員可用時自動設置其優先級,因此你無需每次都深入任務管理器。它還具有一個巨大的重置按鈕形式的安全網,如果你的計算機開始緊張並且你需要恢復一些性能,你可以點擊該按鈕。
這個插件是一個很棒的節省時間的插件,但要清楚;Compiler Booster 不會做任何事情,只是按照本文中列出的步驟自己完成。也就是說,它的價格為 5.99 美元,價格低廉,並且可以自動化編譯過程中繁瑣的部分。
它有一些可以改進的用戶體驗。例如,你的設置不會保存在任何地方,因此如果你重新啟動編輯器,或者如果你關閉 Compiler Booster 窗口(最小化可以),它們將需要重置。
再次抱歉 Mac 和 Linux 用戶,Compiler Booster 僅適用於 Windows。
- End -