天天看點

《天谕》手遊的記憶體控制 -筆記

《天谕》手遊的記憶體控制 -筆記
《天谕》手遊的記憶體控制 -筆記

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。

  1. 格式ASTC8 x 8,部分精度要求高的6 x 6 或者 4 x 4

    Ios放棄iPhone5s/iPad mini3

    Android給低配機單獨的包(ETC 8 bits)

  2. 【尺寸】控制貼圖尺寸
  3. 【尺寸】針對不同貼圖單獨縮放尺寸
  4. 【Mipmaps】UI等貼圖關閉Mipmaps,不然會多33%的記憶體
  5. 【Read/Write】關閉貼圖的Read/Write Enabled,否則CPU和GPU都會有一份
  6. 【張數】去掉重複的貼圖,合并通道減少貼圖張數

《天谕》手遊貼圖規範:

《天谕》手遊的記憶體控制 -筆記
Mesh記憶體優化Tips
  1. 控制網格定點和三角形數量
  2. Mesh Lod可以有效降低面數和記憶體
  3. 去掉不用的定點屬性(uv, colors等等)
  4. 建議關閉網格的Read/Write

《天谕》手遊的Mesh規範:

《天谕》手遊的記憶體控制 -筆記
動畫
  1. MMO幀率30基本夠
  2. 嚴格控制動畫時長
  3. Generic可以通過壓縮浮點精度/去除scale曲線/keyframe reduction等方式進行壓縮
  4. Humanoid動畫比generic動畫要小
  5. 壓縮(Optimal 預設 2 2 2)
  6. 盡可能的複用動畫資源(Retarget)
  7. Animator Controller會加載所有動畫,需要優化
其他
  1. 中文字型裁剪(FontCreator + FontSubsetPack) 12M → 3M
  2. RenderTexture張數 尺寸 格式
  3. AssetBundle去掉TypeTree!可以減少30%-50%左右的記憶體,還可以略微提高加載解析速度
  4. 音頻優化(通道/碼率/streaming/按需加載)

三、腳本記憶體優化

  1. 控制高頻的記憶體配置設定
  2. 控制大塊的記憶體申請
  3. 控制容易導緻gc alloc的函數調用
  4. 緩存和複用

《天谕》項目組的代碼規範

《天谕》手遊的記憶體控制 -筆記
代碼C++化

why

  1. 提高運算性能
  2. 減少頻繁調用導緻的頻繁GC

What

  1. XML檔案解析
  2. 網絡包處理
  3. 屬性和戰鬥結算
  4. 資料表壓縮

風險

  1. 無法熱更
Shader記憶體優化

Shader這塊沒什麼好說的,控制了一些變體之後,他們的總記憶體從130MB降到了41MB。

最後使用IPreprocessShaders将記憶體又降到了10Mb左右

《天谕》手遊的記憶體控制 -筆記

四、總量控制、分級管理

《天谕》手遊的記憶體控制 -筆記

由于《天谕》的資源太大,如果不做總量控制,直接加載進來的話,随時可能會撐爆記憶體。是以他們做了一套預算管理系統。控制着每個資源的建立,與自動降級。

對不同機型的配置,他們做了一個專門的設定界面,主要針對各種ios裝置,設定各種高中低的開關

《天谕》手遊的記憶體控制 -筆記

前期的資源,性能規範雖然很難做,但還是要去做。

《天谕》手遊的記憶體控制 -筆記

這是他們的資源分析系統,可以看到有多個任務在執行。

《天谕》手遊的記憶體控制 -筆記

最後的總結:

《天谕》手遊的記憶體控制 -筆記

轉載請注明出處: 李嘉的部落格 - http://www.cnblogs.com/lijiajia

繼續閱讀