當前位置:首頁 >教程首頁 > Unreal Engine >Unreal如何加速shader編譯?

Unreal如何加速shader編譯?

發布時間:2021-08-03 09:43:19

Hello,大家好,今天來分享Unreal如何加速shader編譯,我是在線搬運工木偶心沒。

0.webp.jpg

如果你很熟悉在虛幻引擎中工作的話,你就會看到右下角那個閃爍的小條不斷地通知你引擎正在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”部分中找到一些常用的。

1.webp.jpg

這些“Used with,,,”複選框中的每一個都代表(至少)一個額外的著色器,需要為你的材質編譯以支持該功能。

如果你使用的材質依賴於switch開關(即static和quality switch -switch參數在運行時編譯時不同),對於每種可能的變化,基礎材質的著色器permutations數量加倍。

2.webp.jpg

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。這可以顯著減少你需要編譯的著色器數量。

3.webp.jpg

在此處進行任何更改都需要重新啟動編輯器,並且不要忘記將鼠標懸停在工具提示上。你需要確保沒有使用依賴於這些著色器的功能,否則 Unreal 會大驚小怪。

5、降低材質的複雜性

根據材質的複雜性,某些著色器的編譯時間會比其他著色器更長。比如幾十個features和由開關控製若幹分支的變化的主材質,將創建了很多 permutations。與由更簡單的設置(如unlit material)生成的著色器相比,每個permutations都需要更長的時間來編譯。

有時為了讓你的遊戲中擁有令人驚歎的效果不可避免要很多功能,但請確保你充分利用了每個material。如果你有不使用的功能,請將其刪除並節省一些時間。

6、添加更多的Shader Compile Worker

當虛幻引擎運行編譯著色器的時,編輯器本身實際上並沒有做太多的跑腿工作。這取決於一個稱為“Shader Compile Worker”的幕後運行的較小程序的實例。

4.png

如果你使用的是 Windows,你將能夠在任務管理器中看到它們。如果你的 CPU 有多個線程,你可能能夠支持比 Unreal 默認創建的更多的並發著色器編譯工作器。你可以導航到Engine\Config\BaseEngine.ini並編輯以下行來添加更多線程,其中 x 是線程數。

NumUnusedShaderCompilingThreads=x

這是一個相對安全的設置。如果你將未使用的著色器編譯線程數設置得太高,Unreal 會自動降低它。你可以盡可能地設置它,它不會使用不存在的線程。

7、給Shader Compile Worker設置更高的優先級

抱歉 Mac 和 Linux 用戶,這是一個僅限 Windows 的技巧。可能其他操作係統也有類似的功能,但是需要研究一下。

在任務管理器的“Details”中,你會看到默認情況下,與大多數進程一樣,你的著色器編譯工作器的優先級設置設置為“normal”。將它們全部設置為“above normal”將導致 Windows 將更多係統資源分配給它們,用來加快它們通過著色器隊列的速度。

5.png

你可能會想要直接設置為“High”,但是我建議不要這樣做。這可以使它們與保持計算機正常運行所需的其他程序具有同等的優先級,但是可能導致大量速度減慢並可能使編輯器和/或計算機崩潰。

8、最小化編輯器開銷

虛幻引擎的著色器編譯器使用異步流係統,它會將要編譯的著色器排隊,並在你工作時逐一處理它們。這有時很有用,因為它允許開發不間斷地繼續,但是如果你希望你的著色器編譯得盡可能快並且不礙事,它就沒有那麼有用了。

虛幻編輯器本身會對你的係統資源造成很大負擔,即使你什麼都不做。這意味著你的 CPU 的很大一部分(有時高達 80%,即使在空閑時也是如此!)隻是忙於管理編輯器。這並沒有為著Shader Compile Worker留下太多空間來做他們的事情。

確保編輯器不是活動窗口會有所幫助,因為 Unreal 在未聚焦時會自動使用較少的係統資源(如果你選擇simulating your game,你會注意到 fps 會顯著下降)。

如果你想繼續工作,你仍然可以通過按Ctrl+R關閉視口中的實時預覽來節省一些時間。

6.png

我用這種技術得到了有好有壞的結果,但其他人發現將編輯器的優先級設置為“低”也有很大幫助。

9、升級硬件

如果你已經完成了所有其他工作,但仍然對著色器隊列的運行速度不滿意,那麼可能是時候考慮升級你的硬件了。

在運行時,著色器是使用計算機的 GPU 或圖形處理單元計算的——但這不是我們想要的。著色器編譯幾乎完全依賴於你的中央處理單元或 CPU。如果你想升級你的裝備,那就先升級處理器或者CPU吧。(雖然也強烈推薦使用 SSD!)

Compiler Booster

這不是一個真正提高編譯速度的方法或者技巧(這可能是一個廣告)。如果你前往 Unreal Marketplace,你會發現一個名為Compiler Booster的引擎插件,由Corentin Guillaum 製作。

Compiler booster 提供了一個易於訪問的界麵,可讓你從編輯器中設置 Shader Compile 工作線程優先級。這包括一個複選框,啟用後,它將在每個工作人員可用時自動設置其優先級,因此你無需每次都深入任務管理器。它還具有一個巨大的重置按鈕形式的安全網,如果你的計算機開始緊張並且你需要恢複一些性能,你可以點擊該按鈕。

7.png

這個插件是一個很棒的節省時間的插件,但要清楚;Compiler Booster 不會做任何事情,隻是按照本文中列出的步驟自己完成。也就是說,它的價格為 5.99 美元,價格低廉,並且可以自動化編譯過程中繁瑣的部分。

它有一些可以改進的用戶體驗。例如,你的設置不會保存在任何地方,因此如果你重新啟動編輯器,或者如果你關閉 Compiler Booster 窗口(最小化可以),它們將需要重置。

再次抱歉 Mac 和 Linux 用戶,Compiler Booster 僅適用於 Windows。

8.jpg

- End -

來源:Thepoly公眾號

华体会hth体育网 賞析
  • 2101期學員李思庭作品

    2101期學員李思庭作品

  • 2104期學員林雪茹作品

    2104期學員林雪茹作品

  • 2107期學員趙淩作品

    2107期學員趙淩作品

  • 2107期學員趙燃作品

    2107期學員趙燃作品

  • 2106期學員徐正浩作品

    2106期學員徐正浩作品

  • 2106期學員弓莉作品

    2106期學員弓莉作品

  • 2105期學員白羽新作品

    2105期學員白羽新作品

  • 2107期學員王佳蕊作品

    2107期學員王佳蕊作品

專業問題谘詢

你擔心的問題,火星幫你解答

微信掃碼入群領福利

掃碼領福利最新AI資訊

點擊谘詢
添加老師微信,馬上領取免費課程資源

1. 打開微信掃一掃,掃描左側二維碼

2. 添加老師微信,馬上領取免費課程資源

×

同學您好!

您已成功報名0元試學活動,老師會在第一時間與您取得聯係,請保持電話暢通!
確定