生活随笔
收集整理的這篇文章主要介紹了
NGUI图集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
NGUI的三大組件,UILabel、UISprite、UITexture,它們三個同時都繼承UIWidget。先回到一個很郁悶的話題上,到底是優化DrawCall還是優化內存。
UISprite : ?NGUI引入圖集的概念,不考慮ABA疊層的情況下,一個圖集內的圖片用UISprite,那么它就是一個DrawCall。但是如果你做了一個圖集是1024X1024的。此時你的界面上只用了圖集中的一張很小的圖,那么很抱歉1024X1024這張大圖都需要載入你的內存里面,1024就是4M的內存,如果你做了10個1024的圖集,你的界面上剛好都只用了每個圖集里面的一張小圖,那么再次抱歉你的內存直接飆40M。另外生成出來的Atlas我記得默認會打開mipMap的選項,mipMap是攝像機離得遠近用不同的圖片,用來減少渲染,可是UI絕對不會出現遠近之分,mipMap會讓你的包占更大的容量,因為是兩張圖。
如下圖所示,Atlas圖集生成完以后,選擇Advanced,不要勾選Generate Mip Maps ,也不要勾選Read/Write Enabled ,不然1024在內存里就不4M了將變成8M。。
?
?
那么NGUI的內存怎么施放呢?我建議最好不要手動施放,因為Unity有一套非常完善自動施放內存的方法。如果你的項目不變態,切場景的時候就用異步切換場景。
| 1 | yield return Application.LoadLevelAsync(name); |
?我發現很多人喜歡切場景的時候,在調用一下Resources.unloadunnsedAssets,這是多此一舉的。
| 1 | Resources.UnloadUnusedAssets (); |
當場景切換完畢后,Unity會自動施放沒有被引用的內存。 我記得NGUI3.X某一個版本是存在內存泄漏的問題,后來我們專門升級了新版本,扯遠了,回到正題!
UITexture:它完全沒有圖集的概念,使用起來非常的靈活,只需要把圖片掛上去就行了。這樣內存里只會占用你這一張圖的大小,內存雖然小了但是DrawCall就上去了。因為每一張UITexture就是一次DrawCall。如果你發現你的UITexture圖片大小不對了,是因為圖片拖進Unity默認圖片的格式會設置成Texture,它的NonPower of2 是默認打開的,所以他會縮放你的圖片成2的冪次方,所以你可以把圖片格式改成GUI。
圖片格式: NGUI生成的圖集的圖片格式是PNG,但是無論是什么格式的圖片,Unity都會自己搞一套格式,并且打包的時候也不會用你文件夾下圖片的格式,而是Unity自己的格式。如果你用UITexture你可以真對每一張圖來修改它的格式,比如一些顏色數比較少的圖片,你可以直接用16bit,如果你的圖片沒有用到透明,你可以用pvr或者etc,這樣你的圖片會更小。可是UISprite就不行,只要其中有一張小圖用了透明,你就得用RGBA32,不然UI就會很難看,你可以自己試試。
除了UITexture 和 Atlas的圖片沒辦法以外(因為必須有透明),不是建議是必須,你的貼圖無論如何都必須是2的冪次方。因為只有2的冪次方圖片 并且沒有透明通道才會被壓縮,IOS會壓縮成pvr格式,Android會壓縮成ETC格式,壓縮以后圖片會小很多的,好幾倍的小。
人物貼圖、場景貼圖、特效貼圖、一定要2的冪次方!切記!!如下圖所示,同樣的貼圖大小。
?RGBA 32 大小 1M
Android ETC 大小170.7KB
IOS PVR 大小 170.8 KB
我覺得界面中那些重復性比較高的圖片最好打成圖集,而一些原畫,或者背景圖建議直接使用UITexture。還有NGUI的圖集其實很占用內存,也很占用空間,為了優化效率盡量讓策劃拖妥協讓UI盡可能的復用。
所以做項目初期就要好好的管理自己的圖集,這也是個很郁悶的話題,因為需求一直都在變所以你很難規劃你的圖集,你不知道美術會設計出來什么樣的圖,你也不知道策劃會設計出來什么樣的界面,所以你很難去確定你的公共圖集 還有 界面特有圖集該如何來規劃。因為一不小心你的圖集就會超過1024,你也不知道那些資源復用性最高。。這也是我覺得NGUI最郁悶的一點。。如果那一天做UI不用自己去規劃圖集而是運行時系統最優選擇,那該多好呀!!!
總結
以上是生活随笔為你收集整理的NGUI图集的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。