UGUI 優化

1 首先是圖集的打包,demo還是以消滅病毒裏面素材來做一個測試來觀察如何優化。

我們發現Batches的值爲6 ,然後圖片沒有打包成圖集的情況。然後我們將這6張圖片打成一張圖集。

這個時候我們發現 Batches的值爲1。我們知道減少Batches批處理的值可以適當的優化遊戲。

當然我們也不能把幾張特別大的合成到一張圖集裏面,這就要具體美工給的圖片具體分析不能一概而論,想上面一張背景圖片都1080*1920了 具體實驗結果是我們對批處理的個數沒有變化。

 

我們用TexturePacker 把這幾張圖片合成一張圖片 然後我們的批處理個數也是1,所以我們並不是非要用Unity Sprites Packer,2中方法都可以用,但是個人還是傾向美工把圖片打包成一個大圖。然後後面還有一個測試我們把2個不同的圖集情況

這一種情況是2個不同的圖集,每個圖集3個Imge,然後發現都沒有重疊,我們發現批處理的個數是2,然後我們將來自於不同圖層的image重疊一下,例如:

 當我們重疊之後我們發現批處理的個數馬上就變成4了,這種情況是中間層來自於一個圖層,而最高層和最底層來自於一個圖層。所以來自於不同圖層儘量不要互相重疊。所以每個界面都應該對應一個圖集,當然這個不侷限於圖片和圖片同樣圖片和text也需要注意重疊的問題。我覺得這種優化一般的公司應該做的是最基本的,就算不是出於優化的考慮,出於管理方便的考慮一般公司也會把每個界面單獨做一個圖集。所以我覺得這種優化是最基本的吧。

2 Text優化。

這裏主要是Text也會存在和Image重疊引起批處理個數增加,同樣不同Text所用的不同字體同樣也會是批處理個數增加。

可以看到3個Text只有2個批處理個數。這個時候我們將Text疊加一下。我們繼續觀察 批處理個數。

當疊加的時候,批處理個數確實增加了但是2個Text內容疊加一般沒有遊戲會出現這種UI吧,所以這個就沒有什麼意義了。 還有就是Text如果選擇RichText屬性的話,RichText屬性他支持類似於HTML的語法,我們來比較一下2中情況下

 我們發現一個使用了RichText屬性,同時Text使用HTML對內容進行定義,另外一種也使用了RichText屬性,但是內容沒有特別的定義。2者之間面數和頂點個數差距數倍,所以儘量不要使用HTML語法對Text內容進行定義,其實換成圖片會更加節省。

3 改變Image和Text顏色儘量不要用Image和Text的Colo屬性來修改顏色,而是用創建一個Materia通過修改Materia從而來實現顏色的變化。爲什麼要這麼複雜的方式來做這樣一個簡單的顏色變化呢?

具體我們通過Profiler來觀察顏色改變會給我們遊戲帶來什麼?

顏色沒有發生變化的我們發現Canvas.SendWillRenderCanvas是沒有產生GC的。當我們用過Color屬性改變顏色的時候我們看看Canvas.SendWillRenderCanvas的GC有沒有發生變化。截圖看看:

我們看到確實產生了0.5K的GC了,然後我們通過材質實現顏色的變化,我們再觀察Canvas.SendWillRenderCanvas的GC的變化。

 我們發現Canvas.SendWillRenderCanvas的GC爲0了。

3 去掉一些不需要Raycast Target選項例如像一些Image,Text等,因爲這個射線檢測是每幀都在進行,例如100個Image上勾選Raycast Target屬性,檢測的時候其實對這100個都進行了檢測了的

4 在測試的時候發現,當我們頻繁的顯示隱藏一個UI頁面的時候同樣會引起Canvas.SendWillRenderCanvas的GC變化,說白了就是顯示隱藏在產生多餘的垃圾,當你頁面元素比較多的時候這個產生的垃圾就會很大。

 這樣一個只有幾個Text和幾個Image產生的GC就4.7K,如果我們只是將整個頁面的ALpha通道的值改爲0的話,我們發現Canvas.SendWillRenderCanvas的GC值爲0。同樣批處理和頂點個數及面數和隱藏頁面保持了一致。

所以這種方案纔是我們需要的。所以這裏我們只需要在我們頁面的物體掛載一個Canvas Group就行了。需要他不顯示直接將他的Alpha屬性值設置爲0即可,顯示的話就默認設置爲1。

5 注意在Image使用Mask的時候會增加批處理的個數,同時也會增加三角面的個數和頂點個數。所以根據自身需求來衡量。同時可以用Rect Mask2D來代替Mask ,因爲Rect Mask2D所增加的批處理個數及三角面和頂點個數都比Mask要小。還有想outline和shadow組件就不要用了,可以用Text Mesh Pro這個插件,還有就是字體在更新的時候不要做成每幀都更新(除了一些實在沒有辦法的非要每幀更新的),當然這就涉及到代碼層面的了,UI的更新應該需要用到MVC或者MVVM框架來實現更新。

這些優化個人覺得你不會可能只是對Unity不夠熟悉造成了,等你看了一遍你就會了。其實最基礎的並且最重要的還是對c#的基礎,軟件設計模式及遊戲中數學(線性代數),這裏推薦一個停更的博客,一個朋友的朋友的博客,好像那個人還是微軟.net模塊的MVP。https://www.cnblogs.com/anytao/archive/2009/05/10/anytao-mvc-06-introductionmvc-part1.html希望對大家加深理解.net有幫助,本人qq:1850761495如有疑問可以聯繫我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章