參考博客:
https://www.xuanyusong.com/archives/3304
https://blog.csdn.net/PS_show/article/details/100525151
https://blog.csdn.net/qq_38721111/article/details/79870373
1、UGUI 圖集
1.1、為什么要使用圖集
對於正常使用的Image,在場景中每添加一個Image,都會調用一次DrawCall來讓GPU進行繪制。如果繪制100個Image,就需要100個DrawCall,太消耗性能了。
而使用圖集,我們就可以歸類不同種類的圖片,之后就可以一次進行多張圖片的繪制處理,只需調用一次DC,提高了效率。
1.2、如何設置圖集
首先我們需要在設置中開啟圖集使用 Edit->Project Setting->Editor
Disabled:不啟用圖集
Enabled For Builds:只在打包時啟用
Always Enabled:永遠啟用
然后選中資源圖片,在Packing Tag中即可設置圖片圖集的名字。
注意:圖片不能放在Resources下,Resources文件夾下的資源將不會被打入圖集。
設置好之后,就可以在 Window->Sprite Packer中查看圖集。
1.3、圖集優化
第1種情況:只有3個img,沒有設置圖集,且三個img互不重疊。
此時的DrawCall為3。(Window->Frame Debugger)
第2種情況:只有3個img,沒有設置圖集,且三個img交叉重疊。
和情況1一樣,DrawCall為3。
第3種情況:只有3個img,設置為一個圖集,且三個img互不重疊
此時的DrawCall為1。
第4種情況:只有3個img,設置為一個圖集,且三個img交叉重疊。
和情況3一樣,DrawCall為1。
第5種情況:只有3個img,設置為兩個圖集(注意是img2單獨一個圖集,img1、3為一個圖集),且三個img互不重疊。
此時的DrawCall為2。
第6種情況:只有3個img,設置為兩個圖集,且三個img交叉重疊。
注意:到了第6種情況,終於到了要說的地方了。此時為什么不是2個DC,而是3個呢?
Unity會按照Hierarchy層級順序從上向下渲染,所以最下面的UI一般會渲染在最前面。
但是如果UI之間產生了交叉重疊的情況,圖集的合批會在不同圖集重疊的地方被打斷,所以第6種情況中的兩個圖集就產生了3個DrawCall。
同樣的,UGUI的Text組件使用的字體文件,每一種字體可以看成一個圖集。
所以使用Unity自帶的Button組件做這個實驗也會得到一樣的結果:
兩個相同的btn,不重疊,會產生2個DC。
兩個相同的btn,交叉重疊,則會產生4個DC。
優化方向:
1、不同UI之間盡量不要重疊。
2、不同圖集的圖片不要交叉使用。
3、Image與Text不要交叉使用,Text盡量放在所有Image的上面,即Hierarchy的最下面。
4、Hierarchy層級關系做分層處理,每一個Atlas的圖片放在同一個層里。