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回調加載圖集