Unity图集优化原理
Unity-UGUI合批優化
- 圖集合批規則
- 例如1:Blue,Green,Orange三個圖片,沒有打包圖集時候。
- 例如2:Blue,Green,Orange三個圖片,打包為一個圖集
- 例如3:Blue,Green,Orange三個圖片,Blue和Green打包到同一個圖集,而Orange打包到另外一個圖集,渲染順序為Blue,Green,Orange.
- 例如4:Blue,Green,Orange三個圖片,Blue和Green打包到同一個圖集,而Orange打包到另外一個圖集,渲染順序為Blue,Orange,Green。
- 優化:所以理解了圖集合批規則之后,就知道優化方向了
圖集合批規則
計算層級號的算法:如果有一個UI元素,它所占的屏幕范圍內(通常是矩形),如果沒有任何UI在它的底下,那么它的層級號就是0(最底下);如果有一個UI在其底下且該UI可以和它Batch,那么它的層級號與底下的UI層級一樣;如果有一個UI在其底下但無法與它Batch,那么它的層級號為底下的UI層級+1;如果有多個UI都在其下面,那么按前兩種方式遍歷計算所有的層級號,其中最大的那個作為自己的層級號。
合并時候:如果相鄰間的兩個批次正好可以Batch的話就會進行Batch。
Unity的UI渲染順序的確定有2個步驟,第一步計算每個UI元素的層級號;第二步合并相同層級號中可以Batch的元素作為一個批次,并對批次進行排序;
例如1:Blue,Green,Orange三個圖片,沒有打包圖集時候。
可以看到產生了三個DrawCall。原因:沒有合并圖集,需要CPU向GUI發送三次渲染請求。
例如2:Blue,Green,Orange三個圖片,打包為一個圖集
可以看到無論是否相交與否,都只產生了一個DrawCall。原因:三個圖片都在同一個圖集當中,渲染時候合批到一起,統一由CPU向GPU發送一次渲染請求即可
例如3:Blue,Green,Orange三個圖片,Blue和Green打包到同一個圖集,而Orange打包到另外一個圖集,渲染順序為Blue,Green,Orange.
可以看到無論是否相交,都只有2個DrawCall。原因:在Hierarchy面板中,先渲染Blue,在渲染Green,最后渲染Orange。這個順序很重要,按照圖集合并規則我們具體去分析,首先渲染Blue,計算他的層級序號,他的下面沒有任何圖片,所以他的層號為0。緊接著看Green,計算它的層級序號,它下面有一個圖片Blue,并且Blue和Green在同一個圖集當中 ,Unity引擎判定它可以合批后,它的層級序號和Blue一樣為0。最后渲染Orange,他的下面是圖片Green,由于Green和Orange的圖片不在同一個圖集,所以無法合批,它的層級序號就位0+1 = 1。
所以第一步:Unity引擎根據計算出Blue和Green層級號相同為0,而Orange層級號為1。
所以第二步:Unity引擎合并相同層級號中可以Batch的元素作為一個批次。Blue和Orange會被合批到一起由CPU向GPU發送一次渲染請求,也就是一個DC,而Orange單獨由CPU向GPU發送一次渲染請求,也就是另外一個DC。所以有2個DC。
例如4:Blue,Green,Orange三個圖片,Blue和Green打包到同一個圖集,而Orange打包到另外一個圖集,渲染順序為Blue,Orange,Green。
第一步:Blue層級號為0,Orange層級號為0,Green層級號為0。
第二步:0層中Blue和Green可以合并到一個批次,而Orange不能,所以2個DC
操做:移動Orange覆蓋Blue
第一步:Blue層級號為0,Orange層級號為1,Green層級號為0
第二步:0層級號中Blue和Green在同一圖集可以合并到一個批次,1層級號Orange單獨一個。所以2個DC
操做:移動Orange被Green覆蓋
第一步:Blue層級號為0,Orange層級號為0,Green層級號為1
第二步:0層級中Blue和Orange不屬于同一個圖集無法合批,所以2個DC,1層級號中只有Green單獨一個元素,所以單獨一個DC。所以總共三個DC
操做:移動Green覆蓋Blue
第一步:Blue層級號為0,Green層級號為0,Orange層級號為0
第二步:0層級號中Blue和Green可以合批,一個DC,Orange單獨一個DC。所以2個DC
操做:移動Green覆蓋Orange。和上面移動Orange被Green覆蓋一個道理。這里還是說明一下
第一步:Blue層級號為0,Green層級號為1,Orange層級號為0
第二步:0層級中Blue和Orange不在同一個圖集2個DC,1層級中Green單獨一個DC。所以三個DC
操做:移動Blue被Orange覆蓋和移動Orange覆蓋Blue一個操做
第一步:Blue層級號為0,Orange層級號為1,Green層級號為0
第二步:0層級中Blue和Green在同一個圖集可以合批,1個DC。1層級中Orange一個DC。所以2個DC
操做:移動Blue被Green覆蓋。和移動Green覆蓋Blue一個操做
第一步:Blue層級號為0,Orange層級號為0,Green層級號為0.
第二步:0層級號中Blue可以和Green合批。一個DC。Orange單獨一個DC。所以2個DC
操做:移動Orange和Green如圖所示
第一步:Blue層級號為0,Orange層級號為1,Green層級號為2.
第二步:0層級中Blue一個DC,1層級中Orange一個DC,2層級中Green一個DC。總共三個DC
操做:如圖所示將三個圖片疊起來
第一步:Blue層級號為0,Orange層級號為1,Green層級號為2
第二步:0層1一個DC,1層級一個DC,2層級一個DC。三個DC
優化:所以理解了圖集合批規則之后,就知道優化方向了
DrawCall:就是CPU向GPU發送的一次渲染命令。
在降低DC方面,我們則需要做的就是盡可能的讓CPU多打包一些信息給GPU,那么DC就自然降低了。在UGUI里面,先不考慮Shader,UI元素中材質和紋理相同的元素就可以被合批。
所謂的圖集:將很多的2DSprite通過Atlas打包合并到一張大圖,那么為什么要這么做?
1。CPU向GPU發送渲染命令時候,只需要大圖就可以了,因為GPU會在這個大圖中進行采樣,然后根據規則生成界面。所以這里也就是為什么需要同一個圖集的原因,如果真的只有一個圖集,那么一個DC就可以把所有需要的信息傳遞給GPU,然后GPU就開始繪制。
2.圖集尺寸是可選的,都為2的次數冪,圖片尺寸為2的次數冪時候處理起來會比不規則的(圖片尺寸不為2 的次數冪)快,就算美術給的圖不是2的次數冪,但是打成圖集之后也是2的次數冪。這是Unity的設計
3.理想化就是將所有的圖打包為一個圖集,這樣就只會有一個DC了,但是這可能嗎?如果圖片資源非常多,那么這張圖片可能就非常大了,資源就非常大了,Unity也不允許,所以設置了最大范圍。所以這個時候我們就需要按照一定的設計規則去進行分類。我們當然是希望DC越少,資源越少。但這是一個互斥的話題。折中思想在古代就一直非常流行,所以都是去找一個平衡點。A:例如一些公共按鈕,公共邊框,作為公共資源盡可能打包到一個圖集當中,如果不夠就2-3個。B:按照功能模塊進行劃分;
總結
以上是生活随笔為你收集整理的Unity图集优化原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python系列(五):bytes和st
- 下一篇: 计算机网络安全技术复习知识点总结