寫在前面
- 在搜“Unity優化”的相關文章時,常會看到"為了省DrawCall,模型上會盡可能用相同材質(其實就是把多個模型貼圖放到一個材質上)"這句話。如果是UI怎么辦呢?UI又不是模型,哪里能體現“相同材質”一說?其實這里就是使用相同圖集。本文旨在演示“使用UI圖集可以降低Batches”(Unity2017版本中,Stats面板中DrawCall換為Batches)。
- 關於UI圖集,Unity以前是用SpritePacker,在2017版本中升級成SpriteAtlas,同時保留老版SpritePacker。在Unity2019版本中,SpriteAtlas和SpritePacker只能二選一,選擇啟用SpriteAtlas就不會再看到PackingTag。SpriteAtlas和SpritePacker的介紹和區別可以看看這篇博文。
測試
- 演示目的:同一界面下,UI盡可能用同一圖集,可以省Batches。
- 測試准備:
- Unity版本: 2017.2.1
- 操作要求:因為Atlas要在運行時才啟用,以下所有測試都會在運行時用FrameDebug進行比較
- 使用Sprite:

-
- 實現效果:一個按鈕下放了很多圖片

【測試一】不使用任何Atlas,所有Sprite都是默認狀態
- 總效果如下:

- 打開FrameDebug,查看渲染過程。它先渲染所有藍瓶。

- 再渲染所有綠瓶。

- 最后渲染所有紅瓶。

- 為了渲染全部效果,分三步,共花費4個Batches。
【測試二】新建圖集Atlas1和Atlas2,紅瓶圖片放入Atlas1,綠瓶和藍瓶圖片放入Atlas2
- 這里Atlas不管是放Texture還是Sprite效果都一樣
- 總效果

- 打開FrameDebug,查看渲染過程。先渲染藍瓶和綠瓶。

- 最后渲染紅瓶

- 為了渲染全部效果,分兩步,共花費3個Batches。
【測試三】Atlas1刪除紅瓶圖片,將紅綠藍瓶所有圖片放入Atlas2
- 如果Atlas1下仍保留紅瓶圖片,同時Atlas2也有紅瓶圖片,Unity仍會引用Atlas1中的紅瓶圖片
- 總效果

- 打開FrameDebug查看,為了渲染全部效果,只用一步,共花費2個Batches。
由此可見,為了省Batches,同一UI上的sprite盡量放在同一Atlas中。
