Unity3D游戏内存瘦身指南: UI优化是关键
游戲占用的內存中,UI部分主要是貼圖資源和字體資源。其中貼圖是單張圖片,而字體包括UIFont和TrueTypeFont(TTF)。
資源占用內存大小,從Unity Profiler可看到許多細節。
?
一、貼圖占用內存優化
(1)縮減貼圖占用內存
注意,貼圖資源占用內存大小不等于文件大小,而是與資源導入設置有關。同一個導入設置則只與資源寬高尺寸有關,與資源原始文件格式無關。在進行安裝包大小瘦身時,已針對各種應用場景,有損或無損的縮減貼圖資源大小。由于資源加載后占用內存大小與安裝包打包前資源大小一致,所以安裝包瘦身實際上也是在減少貼圖資源占用內存大小。
舉個例子:一張512x512貼圖。
使用RGBA 32bit真彩,占用內存 = 4Bytes*512*512 = 1MB;
使用RGB ETC 4bit壓縮,占用內存 = 0.5Bytes*512*512 = 128KB。
具體的壓縮選型和操作細節,可參考安裝包瘦身一文。
?
某些壓縮方式是無損的,某些是有損的,應按需采用。
(2)拆分大資源,且按需加載
貼圖資源使用方式包括UITexture和UIAtlas這兩類。其本質都是一張圖片,區別在于UITexture是單張大圖,而UIAtlas是多張小圖合集做成一張大圖。某些應用場景中可以將大尺寸UIAtlas拆分為小尺寸UIAtlas和多個UITexture,然后按需加載顯示。拆分后內存占用大小<=拆分前內存占用大小。
舉個例子:新手引導圖集(調整前1024x1024,4MB)。
?
單局中并不需要同時顯示全部角色和道具Icon。于是可拆分成多個,按需加載,即可減少占用內存總大小。
?
新手引導圖集(調整后1024x512,2MB)。
?
再加數個拆分出來的小圖(幾百KB)。
?
(3)及時回收過時資源
方法(1)優化了常駐的內存大小。如果一張貼圖使用后不再被使用,手機號碼又沒有被及時回收,那么內存占用總量會只增不減。這些過時資源應及時回收。
實踐中發現幾個現象:
?
?
回收UI資源的代碼片段(供參考):
?
此方法在Application.LoadLevel前后執行。此方法有些暴力,全部UITexture和UIAtlas的貼圖資源都被掃描且可能被UnloadAsset。
此處白名單Texture和動態創建Texture需單獨處理,否則可能報錯。舉例:下圖是UnloadAsset網絡下載的玩家頭像報錯了。
?
如果貼圖資源再次使用,那么在加載prefab時會重新加載相關貼圖資源。
其中包含幾個關鍵方法:
?
注意這里卸載資源用協程分了幾幀實現。受限于上述方法的先后執行順序,放在同一幀處理達不到卸載的目的。
二、字體占用內存優化。
(1)UIFont字體,占用內存大小與字體貼圖資源導入設置有關。優化思路同Texture貼圖,包括縮小字號、只制作所需字符、復用字體等。比如以下字體同時用在單局結算分數和伙伴技能冒字。
?
(2)TTF字體,占用內存大小等于文件大小。優化思路是盡量復用字體,減少使用差異化字體。
?
?
三、效果舉例。
經過先前安裝包瘦身,已減少幾十MB貼圖資源占用內存。
又依照上述方法優化,包括縮減資源尺寸(紅色)、卸載過時資源(綠色)、整合字體(橙色),進一步又減少了約26MB內存占用。
?
總結
以上是生活随笔為你收集整理的Unity3D游戏内存瘦身指南: UI优化是关键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity进阶技巧 - 从文件读取游戏数
- 下一篇: 寻路算法实例解析:贪吃蛇AI的实现