《天諭》手游的內存控制 -筆記


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設備,設置各種高中低的開關

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

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

最后的總結:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM