跳到主要內容

熟悉 Unity Memory

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



    新版 Unity 4.0 以後開始支援 memory profiler,從下圖可以看到 Simple/Detail 兩個不同的模式,Simple Profiler (圖1)主要是每個 frame 紀錄使用的 object 數量跟總記憶體,仔細看還分門別類有 Unity、Mono、GfxDriver....等;仔細看會發現有 Used Total 跟 Reserved Total,主要呢 reserved Total 會把預先跟 os 要的記憶體 pool 算進去,但實際遊戲使用到記憶體量並沒這麼大;且實際測試發現 Editor run 越多次 Reserved Total 會越大,追蹤記憶體主要還是以 Used Total 為主;切換成 Detail 模式(圖2),主要是點擊 Sample 按鈕可以擷取當下 memory 使用資訊。


(※ 在 Editor 下 Sample 會出 AssetDatabase 占用大量記憶體,這部分只會出現在 Editor;且在 Editor 下 Texture 載入記憶體會是 Inspector 看到的記憶體兩倍。)
圖1
圖2

    但經過一陣子測試發現了一個滿冏的狀況,Unity memory Profiler 顯示的 Used Total 跟 app 實際使用記憶體並不相等,Unity Memory Profiler 顯示使用量大於 android meminfo 顯示量,從下圖3、4看到記憶體使用量約為 92 mb,而 Unity Profiler 顯示記憶體使用 115 mb,有可能是 profiler 造成記憶體額外增加或是 GfxDriver 預估差額造成,在不清楚的狀況下還是使用 Unity Profiler...畢竟 procrank 並不能告訴我們是誰用了這麼多記憶體!

圖3

圖4

    在改版作業、包檔進行的同時,app 總是會忽然掛掉直接退回桌面,上網 google 了一下找到了有關解答,主要是 android dalvik virtual machine 會規劃每一個 dalvik VM 能夠執行的最大記憶體量,超過就會被 os 強制 shut down(此時應該就不是快拍進入休眠狀態了)。執行底下 command line 後就可以得到 dalvik heapSize 了。

adb shell cat /system/build.prop


圖5

※ 如果你對 android sdk 感興趣的話,其實可以玩玩 sdk 中的 monitor 工具 ~在這我就不多說了,官網上有更詳細的介紹。


[ref] http://docs.unity3d.com/Documentation/Manual/ProfilerMemory.html


留言

  1. 你好~
    我的2D遊戲 total memory 竟160MB, 其中GfxDriver就130MB,這正常嗎?

    還有iOS有沒有類似的moniter tool?

    回覆刪除
  2. 請問你的數據來源是用 Unity Editor Profiler 取到的嗎?我先前測試的數據中 GfxDriver 都不會太高,舉例 Used Total ~ 約 80 mb,則 GfxDirver ~約 23mb

    然後 Unity docu 對於 GfxDriver 解釋是 The estimated amount of memory the driver is using on Textures, Rendertargets, shaders and Meshdata,首先我認為這個值是概估的,而且是顯卡 memory 使用量(我猜測),
    你可以大概去分析遊戲中用到 1k x 1k 介面圖總共有幾張大概就知道介面圖素佔比會多大,不過 130 mb 是
    包含 UI、Texture、Geometry Data .... 等,所以單純去看 GfxDriver 是有點不準的,但這個值大或小是有討論
    意義。

    意見僅供參考 ~ 希望能幫的上忙

    回覆刪除

張貼留言

這個網誌中的熱門文章

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 呢?