UGUI 圖集方案 & DrawCall優化 & UI資源打包策略

Unity UGUI 打包圖集方案


Sprite Packer (4.X版本以上)

    *    小圖資源需關閉Read/Write,否則打不進圖集裏,好奇怪!!!!。

    *    Resources文件夾下的資源是不被打包進圖集的。

    *    Sprite2d 設置PackingTag 決定資源被打進哪個圖集。

        *    需要爲每個資源設置PackingTag(麻煩),且可視化控制不友好。

    *    圖集只能通過 Windows->2D-> Sprite Packer 界面查看,不太方便。

    *    打包策略支持定製化


Sprite Atlas (2017.1 版本以上)

*    通過 Asset-> Creat -> Sprite Atlas 創建,SpriteAtlas也是Unity資源,在Inspector界面方便預覽。

*    支持更多樣化的參數設置。
    
    *    打包時是否支持精靈旋轉(Allow Rotation),參考官方文檔,此選項Canvas UI資源不能勾選
    *    貼圖的採樣模式(Filter Mode)
    *    各個平臺的壓縮方式(Compression),此選項會覆蓋散圖的壓縮設置......

*    支持文件夾打包、單個文件,以及任意組合,方便操作。

*    支持圖集variant(圖集變種)
    
    *    所謂Variant,就是指原有圖集的一個變種。它會複製原有圖集的貼圖,並根據一個比例係數來調整複製貼圖的大小。這樣的Variant通常用於爲高分辨率和低分辨率的     屏幕準備不同的圖集。

*    Unity運行時如果使用到圖集中的某個資源,會加載包含所有資源的整個圖集,這對於內存和流暢度來說都不太友好
    
    *    合理的根據使用情況劃分圖集

    *    減少突擊中的圖片間留白

兩者差別:
    https://www.jianshu.com/p/2640bdb29fdc


圖集對UIDrawCall的影響

    *    理想情況下,界面UI共用圖集資源,不存在穿插的情況下,DrawCall數 = 圖集數 (同NGUI)

    *    應用過程中,存在會打亂DrawCall合併的情況麼?

        *    Text組件會排在Image組件之前渲染

        *    Mesh區域重疊會導致Drawcall增加,注意並不是RectTransform重疊。

        *    RawImage並不是所有情況下都佔一個DrawCall,使用相同材質且相同貼圖的時候,能被合併爲一個DrwaCall。

        *    UI元素Position的Z值不爲0時,會被視爲3D UI,不參與合批。父節點Z != 0,則下面的元素都無法合批了

        *     UI元素rotation在x/y軸上的旋轉會打斷drawcall的合併, z軸不影響,原因同上。

    *    關於Mask

        *    RectMask2D

            *    本身無額外DC
            *    RectMask2D之間無法合併DC
            *    RectMask2D無法和RectMask2D之外的元素合批
            *    完全被RectMask2D裁剪的元素,不佔用DC,且不參與Depth計算
            *    部分被RectMask2D裁剪的元素,即使Depth/Atlas和RectMask2D下的某一個元素相同,也無法合批。被剪掉的部分,參與depth計算。
            *    多個RectMask2D的Image如果屬於同一個Atlas可以合併

        *    Mask

            *    Mask組件會佔用兩個DC,一個在底下設置stencil buffer,一個在頂上還原stencil buffer,Mask下的元素夾在中間
            *    多個Mash綁定的Image組件若屬於同一個Atlas,那麼Mask之間的元素可以進行合併(包括Mask本身佔用的DC)。
            *    Mask之外的元素和Mask之內的元素無法合併
            *    Mask完全裁剪的元素,依然佔據DC
            *    被Mask分割的元素,可以正常合併
            *    Mask裁剪掉的元素依然參與其他元素的Depth計算,自身也受收到其他元素的影響。

    *    動靜分離的影響?

        *    頻繁觸發Position/Rotation/Scale/Color/Material屬性變化的UI和常態不變的UI使用Canvas分割,減少界面網格重構時的時間和空間成本。

    *    圖集打包後對當前UI資源引用是否有影響?

        *    Editor模式下預覽UI,需要切換Enable/Disable才能刷新展示

        *    其他情況基本無影響

    參考:
        https://www.jianshu.com/p/061e67308e5f
        https://blog.csdn.net/akak2010110/article/details/80953370
        https://blog.csdn.net/akak2010110/article/details/80964416


資源打包Attentions
    
    *    Sprite資源單獨打AB包s,包中有Sprite + Texture 的組合 Sprite記錄2DUI圖片的設置信息,Texture是源圖

    *    spriteAtlas 打AB包時需要取消勾選 Include in Build,並在運行時用OnAtlasRequested動態加載Atlas。

    *    被設置進一個Atlas的 Sprite需要被打在一個AB裏,不然在不同Sprite所在的AB中都會出現圖集的大圖。

    *    散圖在bundle中是否出現?如果出現,是否必須出現?(SpriteAtlas 是一張大圖,所以不需要散圖?)
        
        *    勾選 Include in Build

            *    只打atlas Ab的情況下,prefab的AB包中存在一張圖集大圖和引用到的Sprite

            *    散圖和atlas文件打在一起,否則引用散圖的prefab Ab中不僅有散圖還有圖集生成的大圖。打成一個AB後,prefab的AB包中只包含 atlas Ab 的依賴。

        *    不勾選 Include in Build

            *    只打atlas------- Atlas AB包中包含一張大圖和所有Sprite,prefab的AB包中包含引用的Sprite,且對Atlas Ab無依賴。

            *    只打散圖-------- Atlas AB包中大圖缺失,只有Sprite,prefab的AB包中不包含Sprite,且對atlas Ab 有依賴關係。

            *    散圖和atlas文件打在一起------- Atlas AB包中包含一張大圖和所有Sprite,prefab的AB包中不包含Sprite,且對atlas Ab 有依賴關係。

    *    散圖的壓縮格式會對圖集大圖清晰度有什麼影響?

    *    大圖壓縮格式對UI效果的影響?

    *    包體及內存變化?考慮大圖的空間浪費和壓縮兩方便效果的對衝。

 

關於OnAtlasRequested
    https://www.cnblogs.com/TheChenLin/p/9763710.html


最終方案

使用SpriteAtlas打包圖集,將散圖和atlas資源打進一個AssetBundle,避免資源冗餘,且保留Preafab和圖集AB的依賴關係

不適用Include in build

利用OnAtlasRequested回調加載圖集

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