Profiler工具
推薦使用XCode分析內存,更准確
一、內存指標的類型:
VSS:Virtual Set Size,虛擬耗用內存。它是一個進程能訪問的所有內存空間地址的大小。這個大小包含了 一些沒有駐留在RAM中的內存,就像mallocs已經被分配,但還沒有寫入。VSS很少用來測量程序的實際使 用內存。
RSS:Resident Set Size,實際使用物理內存。RSS是一個進程在RAM中實際持有的內存大小。RSS可能會 產生誤導,因為它包含了所有該進程使用的共享庫所占用的內存,一個被加載到內存中的共享庫可能有很 多進程會使用它。RSS不是單個進程使用內存量的精確表示。
PSS:Proportional Set Size,實際使用的物理內存,它與RSS不同,它會按比例分配共享庫所占用的內存。 例如,如果有三個進程共享一個占30頁內存控件的共享庫,每個進程在計算PSS的時候,只會計算10頁。 PSS是一個非常有用的數值,如果系統中所有的進程的PSS相加,所得和即為系統占用內存的總和。當一個 進程被殺死后,它所占用的共享庫內存將會被其他仍然使用該共享庫的進程所分擔。在這種方式下,PSS 也會帶來誤導,因為當一個進程被殺后,PSS並不代表系統回收的內存大小。
USS:Unique Set Size,進程獨自占用的物理內存。這部分內存完全是該進程獨享的。USS是一個非常有用 的數值,因為它表明了運行一個特定進程所需的真正內存成本。當一個進程被殺死,USS就是所有系統回 收的內存。USS是用來檢查進程中是否有內存泄露的最好選擇。
簡單來說,主要我們檢測PSS,USS。
USS = 進程獨占的內存
RSS = USS + 共享內存
PSS = USS + 共享內存/共享這段內存的進程數量
如何獲取PSS、USS
在unity中:
Debug.MemoryInfo localMemoryInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(localMemoryInfo);
localMemoryInfo.getTotalPss();
localMemoryInfo.getTotalPrivateDirty();//USS
使用adb:
adb shell dumpsys meminfo 進程名
(結果里privte dirty就是USS)
二、資源內存優化
貼圖優化
主要還是講的那些老生常談的Tips。
-
格式ASTC8 x 8,部分精度要求高的6 x 6 或者 4 x 4
Ios放棄iPhone5s/iPad mini3
Android給低配機單獨的包(ETC 8 bits)
-
【尺寸】控制貼圖尺寸
-
【尺寸】針對不同貼圖單獨縮放尺寸
-
【Mipmaps】UI等貼圖關閉Mipmaps,不然會多33%的內存
-
【Read/Write】關閉貼圖的Read/Write Enabled,否則CPU和GPU都會有一份
-
【張數】去掉重復的貼圖,合並通道減少貼圖張數
《天諭》手游貼圖規范:
Mesh內存優化Tips
- 控制網格定點和三角形數量
- Mesh Lod可以有效降低面數和內存
- 去掉不用的定點屬性(uv, colors等等)
- 建議關閉網格的Read/Write
《天諭》手游的Mesh規范:
動畫
- MMO幀率30基本夠
- 嚴格控制動畫時長
- Generic可以通過壓縮浮點精度/去除scale曲線/keyframe reduction等方式進行壓縮
- Humanoid動畫比generic動畫要小
- 壓縮(Optimal 默認 2 2 2)
- 盡可能的復用動畫資源(Retarget)
- Animator Controller會加載所有動畫,需要優化
其他
- 中文字體裁剪(FontCreator + FontSubsetPack) 12M → 3M
- RenderTexture張數 尺寸 格式
- AssetBundle去掉TypeTree!可以減少30%-50%左右的內存,還可以略微提高加載解析速度
- 音頻優化(通道/碼率/streaming/按需加載)
三、腳本內存優化
- 控制高頻的內存分配
- 控制大塊的內存申請
- 控制容易導致gc alloc的函數調用
- 緩存和復用
《天諭》項目組的代碼規范
代碼C++化
why
- 提高運算性能
- 減少頻繁調用導致的頻繁GC
What
- XML文件解析
- 網絡包處理
- 屬性和戰斗結算
- 數據表壓縮
風險
- 無法熱更
Shader內存優化
Shader這塊沒什么好說的,控制了一些變體之后,他們的總內存從130MB降到了41MB。
最后使用IPreprocessShaders將內存又降到了10Mb左右
四、總量控制、分級管理
由於《天諭》的資源太大,如果不做總量控制,直接加載進來的話,隨時可能會撐爆內存。所以他們做了一套預算管理系統。控制着每個資源的創建,與自動降級。
對不同機型的配置,他們做了一個專門的設置界面,主要針對各種ios設備,設置各種高中低的開關
前期的資源,性能規范雖然很難做,但還是要去做。
這是他們的資源分析系統,可以看到有多個任務在執行。
最后的總結: