Unity - SRP Batcher:提升您的渲染性能

在2018年,Unity引入了一種高可定製的渲染技術,稱之爲Scriptable Render Pipeline(SRP)。

其中一部分是一個名爲SRP Batcher的新底層渲染路徑,它可以在渲染過程中提升渲染性能1.2~4倍。

 

取決於使用場景,官方提供了一個視頻,讓我們來看看:

https://youtu.be/pUM7ifjGKkM

視頻請自行爬樓梯觀看

 

以上視頻展示了Unity的最壞情況:每個對象都是動態的,並使用不同的材質(顏色,紋理);場景顯示了許多相似的Mesh,但每個對象使用一個不同的Mesh(因此不能使用GPU Instance技術); 結果:在PS4上性能提升4倍

 

Unity 和 Materials(材質)

Unity編輯器是非常靈活的渲染引擎,我們可以在運行期間隨時修改材質屬性。

Unity歷史上是基於--非常量緩衝區(non-constant buffers)的,支持如DirectX9這種圖形API。

所以, 當渲染使用了新材質時,這就需要大量的準備工作;即:在場景中擁有的材質越多,CPU提交給GPU的數據也越多。

標準Unity渲染流程

在Unity內部渲染路徑中,當檢測到新材質時,CPU會收集所有屬性並在GPU內存中設置不同的常量緩衝區。 GPU緩衝區的數量取決於Shader如何聲明其CBUFFER。

 

SRP Batcher 的工作原理

如果我們使用SRP技術,我們需要關心並寫一些引擎底層代碼。我們能原生地集成一些新的範式 - 比如GPU的數據管理(生命權);目標是由大量不同材質、但Shader變體較少的場景下,提升渲染性能。

如下,底層渲染路徑可以讓材質數據在GPU中持久存在。如果材質沒有發生變化的話,則無需設置緩衝區並將其上傳到GPU。此外,可以使用專用代碼快速更新指定數據至大量的GPU-Buff上。新的流程圖是這樣的:

 

SRP Batcher 渲染流程

 

這裏,CPU只處理內置的引擎屬性,比如基本轉換矩陣,所有的材質被託管至GPU的CBuffer上,隨時可以被調用;

性能提升來自於:

1、所有材質數據都被託管至GPU內存中

2、每個對象的基礎數據(例如Position/Scale/Rotation...) 被託管至GPU CBuffer中

 

【未完待續】