背景和概述
從Unity4.x到Unity5.2活孩,Unity內(nèi)置的Memory Profiler一直雞肋贷祈,不能很容易地借此進(jìn)行內(nèi)存優(yōu)化狈醉。
從Unity5.3開始,Unity提供了一個(gè)新的Memory Profiler工具牲芋,能非常直觀地辨別內(nèi)存類別間的大小關(guān)系撩笆,且能找到精確的內(nèi)存引用鏈條,故而可以很方便地進(jìn)行內(nèi)存優(yōu)化缸浦。
使用新Memory Profiler的要求是Unity5.3及其以上夕冲、使用IL2CPP和構(gòu)建時(shí)開啟Development Build。
(從此裂逐,我們就不怕優(yōu)化內(nèi)存沒有頭緒了4跤恪!2犯摺)
舊Memory Profiler的問題
個(gè)人匯總舊Memory Profiler存在的問題如下:
- 不能直觀地對(duì)比內(nèi)存占用大小關(guān)系
- 舊Memory Profiler通過樹狀列表進(jìn)行內(nèi)存分類展現(xiàn)弥姻、每行旁邊標(biāo)上內(nèi)存占用大小數(shù)字。但內(nèi)存分析過程中掺涛,隨著樹深度的不斷展開庭敦,人腦對(duì)數(shù)字的敏感會(huì)出現(xiàn)偏差,常會(huì)出現(xiàn)“繞暈”了的感覺薪缆。
- 內(nèi)存引用鏈條不準(zhǔn)確秧廉,形同虛設(shè),但這對(duì)于內(nèi)存優(yōu)化來說又偏偏是至關(guān)重要的拣帽。
- 你給我標(biāo)一個(gè)“ManagedStaticReferences”我又不知道它是啥疼电?有何用?减拭?蔽豺?
- 你給我標(biāo)一個(gè)“SceneObject”我又不知道它是啥?有何用峡谊?茫虽?刊苍?
- 不包括詳細(xì)的Mono對(duì)象內(nèi)存統(tǒng)計(jì)
- 目睹一個(gè)ManagedHeap.UsedSize幾十M卻又不知道里面到底包含了哪些我們寫的C#/Mono對(duì)象,這種心情是忐忑的濒析!
- 會(huì)錯(cuò)誤地把Editor的內(nèi)存也統(tǒng)計(jì)進(jìn)來
簡(jiǎn)而言之正什,舊Memory Profiler的使用感覺是:“褲子都脫了,你就給我看這個(gè)号杏?婴氮!”。
(寫上面這些文字時(shí)勾起了曾經(jīng)痛苦的內(nèi)存分析回憶盾致,所以心情激動(dòng)了)
新Memory Profiler
針對(duì)舊Memory Profiler的缺點(diǎn)主经,新Memory Profiler都進(jìn)行了解決。
直觀地對(duì)比內(nèi)存大小關(guān)系
新Memory Profiler將所有內(nèi)存對(duì)象都合理地排列在一個(gè)可縮放的矩形里庭惜,提供了異常直觀的內(nèi)存大小關(guān)系對(duì)比罩驻。
比如,我們運(yùn)行時(shí)采用StringBuilder進(jìn)行Unity日志的保存护赊,以便于輸出日志到本地惠遏。這時(shí)一個(gè)合理的擔(dān)心是這個(gè)會(huì)不會(huì)對(duì)內(nèi)存造成很大影響?
有了新排版的Memory Profiler骏啰,你只需鼠標(biāo)滾輪一滾节吮,就直觀地知道原來你曾經(jīng)的擔(dān)心原來只是冰山一角了。
正確精確的內(nèi)存引用鏈
當(dāng)用戶選擇了任意一塊內(nèi)存透绩,新Memory Profiler都能正確精確地顯示其引用鏈。
以上圖為例壁熄,當(dāng)用戶選擇了一張ENV10_hill02紋理帚豪,新Memory Profiler能正確精確地顯示其直接引用ENV10_hill02這個(gè)Material和引用鏈,如圖中的ENV10_hill03這個(gè)MeshRenderer是其引用根節(jié)點(diǎn)请毛。
Mono對(duì)象內(nèi)存統(tǒng)計(jì)
如下圖志鞍,新Memory Profiler成功進(jìn)行了Mono對(duì)象內(nèi)存統(tǒng)計(jì)瞭亮。
(在沒新的Memory Profiler之前要分析精確的Mono對(duì)象內(nèi)存方仿,則必須要替換其Mono運(yùn)行時(shí)為一個(gè)特殊的、進(jìn)行內(nèi)存監(jiān)控的Mono運(yùn)行時(shí)统翩,方能進(jìn)行Mono對(duì)象內(nèi)存統(tǒng)計(jì)仙蚜。)
只會(huì)統(tǒng)計(jì)實(shí)際真機(jī)聯(lián)調(diào)的內(nèi)存
目前沒發(fā)現(xiàn)Editor的內(nèi)存有被新Memory Profiler統(tǒng)計(jì)進(jìn)來。
新Memory Profiler的使用方法
基礎(chǔ)要求
使用新Memory Profiler的基礎(chǔ)要求是
- Unity5.3及其以上
- 使用IL2CPP厂汗,比如iOS平臺(tái)
- 構(gòu)建時(shí)開啟Development Build
使用方法
下面以對(duì)iOS程序進(jìn)行Memory Profile為例委粉,在OSX進(jìn)行。
- 安裝Unity5.3娶桦,并打開能正常編譯通過的Unity項(xiàng)目工程
- 注意選擇Scripting Backend是IL2CPP:Edit>ProjectSettings>Player>iOS>Scripting Backend>IL2CPP
- 開啟Development Build構(gòu)建
- 手機(jī)安裝好ipa
- 在Unity的Bitbucket開源庫(kù)里下載新Memory Profiler贾节,并用Unity5.3打開該工程
- 手機(jī)USB連上電腦
-
打開傳統(tǒng)Profiler汁汗,如下圖進(jìn)行選擇,確保UnityEditor已正確選擇并連上移動(dòng)設(shè)備進(jìn)行Profile
-
點(diǎn)擊Window>MemoryProfiler栗涂,打開新Memory Profiler窗口
- 點(diǎn)擊Take Snapshot
-
成功用新Memory Profiler截取內(nèi)存分析