SRPBatcher優化的原理


之前只是粗糙的看了一下SRP渲染管線,做出了只是加上了自定義,沒什么免費的優化的論斷,今天偶然翻到SRPBatcher,打臉了,發現還是有免費的優化的,就了解了一下原理,記錄如下。

1.在過去的渲染架構中,Unity采取對一個材質分配一個CBuffer(or 一個Pass,這不是重點),這個CBuffer 包括shader里的顯性的參數(你自己定義的uniform參數)和隱性的參數(unity固定的uniform modelMatrix,modelviewMatrix之類。),所以每一次drawcall,要更新這個CBuffer

2.在SRP渲染架構中,Unity采取的策略是對一個材質分配一個半CBuffer,為什么是一個半呢?首先shader的顯性參數分配到一個CBuffer里,shader的隱性參數則是N個物體共享一個CBuffer。

比如一個shader 對應 10個物體,在SRP渲染架構中,一共分配了11個CBuffer,其中10個分別存這10個物體材質中定義的顯性參數。然后分配一個大的CBuffer,把這10個物體的modelMatrix這類隱性參數都放在一起。

乍一看這不是負優化嗎?老架構更新10個CBuffer,你現在更新11個。

這個策略叫做動靜分離,材質的顯性參數大部分都是低頻更新的(你總不能一個游戲所有的材質參數每楨都改變吧),所以在理想情況下,這10個放顯性參數的CBuffer就基本不修改。而modelMatrix之類的隱性參數是高頻更新的,很多模型會動來動去。他們被批量放在一個CBuffer里,一次更新可以更新一片。

以上,據Unity官方宣傳 SRP Batcher 可以取得 1.2~4 倍的 CPU渲染時間提升(僅提升CPU部分,不是渲染耗時提升這么多,還得看cpu瓶頸占多大比重)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM