跳到主要內容

用 unity memory profiler 查 memory 使用問題

上傳進度:已上傳 181001 個位元組 (共 181001 個位元組)。


記憶體使用概覽

Total Allocated (總分配記憶體): 1.31 GB

  • 這是Unity向系統申請的總記憶體量
  • 可以超過裝置的實際可用記憶體而不會出問題

Total Resident On Device (裝置常駐記憶體): 0.62 GB

  • 這是實際佔用裝置實體記憶體的量
  • 這個數值才是真正影響裝置效能的關鍵指標

分配記憶體分布詳解

1. Executables & Mapped (0.52 GB) - 黃色

  • 可執行檔和映射檔案佔用的記憶體
  • 包括Unity引擎程式碼、你的遊戲程式碼、第三方函式庫等

2. Native (278.9 MB) - 綠色

  • Unity引擎本身使用的C++層記憶體
  • 包括:
    • 渲染系統(MeshMaterialShader等)
    • 音訊系統
    • 物理引擎
    • 粒子系統
    • 動畫系統等Unity底層元件

3. Managed (196.6 MB) - 藍色

  • C#腳本使用的托管記憶體
  • MonoIL2CPP虛擬機管理
  • 包括你寫的C#程式碼建立的所有物件
  • 下方的「Managed Heap Utilization」顯示詳情:
    • Virtual Machine: 124.2 MB(虛擬機本身)
    • Empty Heap Space: 39.7 MB(空閒堆疊空間)
    • Objects: 32.7 MB(實際C#物件)

4. Graphics (Estimated) (163.6 MB) - 紫色斜紋

  • GPU顯示記憶體的估算值
  • 包括紋理、渲染目標、幀緩衝等
  • 注意是「估算」,實際值可能有差異

5. Untracked (165.4 MB) - 灰色斜紋

  • 未被分類追蹤的記憶體
  • 可能包括:
    • 第三方外掛的記憶體使用
    • 系統層級的記憶體開銷
    • Profiler無法準確歸類的記憶體

Unity物件類別(Top Unity Objects Categories)

顯示了哪些類型的Unity物件佔用最多記憶體:

最佳化建議

從你的資料來看:

  1. Texture2D佔用最大:考慮壓縮紋理格式、降低解析度
  2. Graphics記憶體較高:最佳化紋理設定,使用Mipmap
  3. Untracked較高:檢查第三方外掛的記憶體使用


NOTE. 
要連接到 memory profiler 必須打包時勾選 developer buildautoconnect 兩個選項


實際上游戲需要關心的是 Untracked、Managed 兩部分的大小,另外需要查看 Unity Objects 裏面有沒有資源重複問題



從 Texture2D 發現 UI atlas 出現重複,但 Editor 下測試卻沒有,這個版本是之前打包的,可能是因爲當時把 2 個 ui prefab 放到 Assetbundle 進行打包測試

留言

這個網誌中的熱門文章

comfyUI 運行出錯 FATAL: kernel fmha_cutlassF_f32_aligned_64x64_rf_sm80 is for sm80-sm100, but was built for sm37

在公司的圖形機器上運行 ComfyUI + WAN 時出現下面問題   FATAL: kernel fmha_cutlassF_f32_aligned_64x64_rf_sm80 is for sm80-sm100, but was built for sm37 算圖機使用的 torch 版本如下 torch 2.7.1+cu118 torchaudio 2.7.1+cu118 torchsde 0.2.6 torchvision 0.22.1+cu118 檢查 cuda 版本 GeForce RTX 5090 CUDA Version: 13.0 從官網看 RTX 5090 支持 12.0 版本 CUDA 這是因爲本地的 pytorch 版本太舊 到官網查詢版本 https://pytorch.org/get-started/locally/ $ pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu126 查詢目前版本 $ pip list | findstr torch 使用這個版本后出現下面問題 後面查詢 no kernel image 問題其實還是 pytorch 並不支持 sm_120( Blackwell架構) 查看后發現并沒有支持 sm_120 CUDA architectures : [' sm_37 ', 'sm_50', 'sm_60', 'sm_61', 'sm_70', 'sm_75', 'sm_80', 'sm_86', 'sm_90', 'compute_37'] sm_50, sm_52, sm_53 : Maxwell (GTX 900 系列) sm_60, sm_61, sm_62 : Pascal (GTX 1000, P100) sm_70, sm_72, sm_75 : Volta/Turing (V100, RTX ...
仔細回想最近的作的 stripping level,還是回頭來說說 import dll 這回事吧;因為從事遊戲改版所以很多事情是言不由衷的,某天發現 server 發送給 client 封包是 big5 encode,第一時間覺得為何不用 unicode 呢?但仔細想也許是遊戲剛規劃時 DB 都已經存了 big5 編碼字串可能已經改不動了,想想也是就算了,結果一包到 android 就發生了 GetEncoding error,因為 android 是採用 unicode 編碼的,在網路上找了找終於找到解法,可以參考底下網址的討論串,主要是下載  I18N.dll、I18N.CJK.dll、I18N.West.dll 並丟到 Assets 資料夾下就可以了,當時還不是很了解為什麼只知道把 dll 都丟進去在手機上就可以跑,直到使用 stripping level 後整個又掛了,才認真去 trace, 問題在於勾選 strip asm 包檔後 I18N.CJK 就沒被包到 apk 裡面,而要解決 strip asm(~"~ 沒辦法 strip asm 很吸引我,一定要想辦法克服)採用了 link.xml 的方式,但這樣要怎麼知道弄進哪些 lib 呢?

熟悉 Unity Memory

    打開始跟 app memory 奮戰,摸索了好一陣子,不管是跑在 andorid 還是 Ios,之前做 WebPlayer 的經驗都派不上用場,也好在網路上資源很多,只要不恥繁找就能找到你所想要的,在此分享的主要是 android(ps. ~"~ 手頭上只有兩台 android 設備)。