URP | Unity圖形優(yōu)化
什么影響渲染性能
URP性能優(yōu)化,主要是3個一個是Batches 和 Saved by Batching ,在加一個SetPass calls 渲染狀態(tài)的次數(shù)

Batches
渲染場景需要多少個批次(也就是需要渲染多少次)
Set Pass calls
設(shè)置渲染狀態(tài)的次數(shù)。
所以優(yōu)化效果,需要考慮這倆方面都很重要
unity為我們提供了哪些方法?


靜態(tài)批處理
批處理條件
標記為 Batching Static 的物體
在使用相同材質(zhì)的條件下
可以理解
打包的時候Unity會自動將這些物體合并到一個大Mesh里
(程序提取這些共享材質(zhì)的靜態(tài)模型的頂點和索引數(shù)據(jù)放到一個共享的Vertex buffer 和 Index Buffer里)
設(shè)置開啟
標記為Batching Static物體,

注意: 不可以移動物體,比如場景物體設(shè)置這個模式,
標記后物體運動時不能移動,旋轉(zhuǎn),縮放。
如果有子物體,會提示字物體是否改成一樣的。

優(yōu)點
提高渲染效率
并不減少Draw call ,減少了渲染狀態(tài)設(shè)置。
但是編輯器會顯示Batches 減少
沒優(yōu)化前

優(yōu)化結(jié)果

缺點
打包后體積增大
運行時內(nèi)存占用增大
多個不同的GameObject 引用同一個Mesh的情況下:
不開啟Static batching ?Mesh會在應用程序,內(nèi)存里存在一份,繪制的時候提交模型頂點信息,然后設(shè)置每一個GameObjec材質(zhì)信息,分別調(diào)用渲染API繪制
開啟Static batching ? ?unity 執(zhí)行編譯的時候,場景中所有引用相同模型的GameObject都必須將模型頂點信息復制,并且計算變化到一個大模型。
包體和內(nèi)存占用都增大。

動態(tài)批處理
Unity 在運行時對符合條件的動態(tài)對象在一個Draw call內(nèi)繪制渲染,降低Draw Call數(shù)量。
基本條件
不超過300個頂點(不超過總計900個屬性)
Shader使用頂點位置,法線,UV可以包含300個頂點(三個屬性就只能是300個頂點)
Shader使用頂點位置,法線,UV0,UV1,切線,則只能包含180個頂點 (五個屬性就只能是180個頂點)
不包含鏡像的Scale縮放
比如物體A ? Scale 為1 , ?物體B Scale 為 -1
材質(zhì)一樣
物體的loghtmap指向的位置一樣

開啟動態(tài)合批
在URP管線里開啟動態(tài)合批

問題:消耗CPU
動態(tài)批處理原理
運行時,在進行場景繪制前,Cpu上將所有的共享同一材質(zhì)的模型,頂點信息變換到世界空間下。
然后通過一次Draw call繪制多個模型,達到合批的目的。
缺點
動態(tài)合批在降低Draw call的同時會導致額外的CPU性能消耗,所以僅僅合批操作的性能消耗小于不合批,
動態(tài)合批才有意義。
動態(tài)合批相當于靜態(tài)合批不需要預先復制模型頂點,所以在內(nèi)存占用和包體方面優(yōu)于靜態(tài)合批。
注意:如果包體大內(nèi)存占用多,使用動態(tài)合批,CPU壓力大,使用靜態(tài)合批。
合批中斷情況
因為動態(tài)合批要求高,所以在使用過程可能出現(xiàn)合批中斷問題。
物體如果都符合條件優(yōu)先參與靜態(tài)批處理,再是GPU Instancing ,然后才是動態(tài)合批
如果使用多Pass Shader的物體會禁用 動態(tài)合批(Dynamic batching)
多個物體必須都是同一個材質(zhì),但是對于Shadow casters 的渲染是一個列外。
盡管Shadow casters使用不同材質(zhì),但是只要他們的材質(zhì)中給Shadow Caster Pass 使用參數(shù)是相同的,
他們也能夠進行 動態(tài)合批。
在Unity中使用前向渲染(Forward Rendering Path) 中如果 一個模型接受多個光照,也不能進行合批。
因為多個光照多次繪制。(URP中多光源是一次繪制)


GPU Instancin (GPU實例化)
GPU Instancin 是什么?
使用少量diaw call 繪制多個相同的Mesh。
比如場景中的建筑,樹,草,石頭等。
如何開啟
Unity 默認Shader 在材質(zhì)下方勾選,就可以開啟。

自定義Shader 如何使用GPU Instancing
參考 : https://docs.unity3d.com/Manual/GPUInstancing.html
GPU Instancin原理
同材質(zhì),同Mesh的物體,
僅繪制一個
其他物體”復制“出來,(其他物體儲存的頂點位置信息和頂點變化的數(shù)值,復制出來)
GPU Instancin限制
同模型同材質(zhì)才能合并到一個Draw call中
支持MeshRenderer和Graphics.DrawMesh調(diào)用
不支持(SjinnedMerhRenderer)帶骨骼動畫的模型。
GPU Instancin無法合批的情況
縮放為負值的情況
代碼動態(tài)改變材質(zhì)變量后不算同一個材質(zhì),但可以通過將顏色變化等變量加入常量緩沖器中實現(xiàn)。
受限于常量緩沖器在不同設(shè)備上的大小的上限,同批的個數(shù)可能不同。
只支持一盞實時光,要在多個光源的情況下使用實例化,只能切換到延遲渲染路徑。

SRP Batcher
SRP Batcher 是一個渲染循環(huán),可加速相同著色器變體的多種材質(zhì)在場景中的CPU渲染速度。
原理
Shader中的變體一致
降低Set Pass Call的消耗
SRP Batcher 通過批處理(batching)—— 系列綁定(Bind)和繪制(Draw)GPU 命令,來減少DrawCalls之間的GPU 設(shè)置(工作量)

設(shè)置
首先在Pipeline Asset(渲染管線中)里勾選SRP Batcher。

在下方勾選SRP Batcher

Shader 支持
在Shader界面我們可以看到是否支持這個效果,才會起作用。

效果
在渲染輸出里查看支持情況,

優(yōu)點
支持模型帶骨骼動畫
SRP Batcher 無法合批情況
對象不可以是粒子
Shader中變體不一致,如Suface Options不一致,導致變體不一致而無法合并
一個不透明物體,一個是透明物體

位置不相鄰且中間夾雜著不同Shader或者不同變體的其他物體,不會進行同批次處理。

總結(jié)
優(yōu)先順序
SRP Batcher > Static Batching > GPU Instancing > Dynamic Batching
優(yōu)先使用SRP Batcher ?> 靜態(tài)合批 > ?GPU Instancing > 動態(tài)合批

資料
【直播回放】Unity 批處理/GPU Instancing/SRP Batcher_嗶哩嗶哩_bilibili
? ?Unity SRP Batcher的工作原理_zakerhero的博客-CSDN博客
? ?Unity 性能優(yōu)化 之 非??岬腟RP Batcher!_zakerhero的博客-CSDN博客