詳解Unity Profiler內存分析問題

在使用Unity開發遊戲的過程當中,藉助Profiler來分析內存使用情況是相當重要的。但許多開發者可能還對Profiler中各項數據表示的含義不甚明確,今天咱們Unity官方的技術工程師柳振東,將針對Profiler內存分析相關的問題及解答,與你們進行分享。 緩存

要想徹底發揮Profiler內存分析的威力,首先要作的就是了解Profiler展現的數據所表達的含義,以及到底哪些模塊所使用的內存纔會被統計到Unity的Profiler中。Profiler涉及到的知識點還有不少,咱們今天先從中挑選一些你們常有的疑問來做解答。app

1.    在Unity的Profiler中看到的總內存使用和我使用其它工具看到的系統內存佔用不太同樣,這是爲何呢?工具

Profiler中看到的內存是經過Unity自身引擎看到的內存分配,凡是引擎Allocation和Deallocation的內存,引擎均有記錄,因此咱們能夠給出確切的引擎內存佔用信息。可是,仍有其餘內存咱們是沒法獲知的。性能

好比,若是引擎使用了第三方庫,那麼庫分配的內存咱們是沒法進行統計的。另外,在移動設備上你們看到的內存,其實都要比Profiler大不少,這是由於不論是經過Xcode的Instrument仍是經過Android的USS,其記錄的真實物理內存都包括兩部分,一個是真實Used的物理內存,另外一個則是緩存的(Cached)的物理內存。這是OS所決定的,Android和iOS系統在資源不使用時均不會當即將其進行回收,而是將其放在緩存的物理內存中,以便下次再用時,能夠快速地加載。當系統發現App的內存不夠用時,纔會在底層調用一個memory killer線程來輪詢緩存物理內存,進而爲app來清理內存。而Unity Profiler記錄的則是目前真實使用的物理內存,即上述所說的第一部分。所以,當遊戲運行時間越長,Profiler分配內存和經過其餘軟件得到的系統內存差距會越大。測試

所以,只要所使用的第三方庫不存在內存泄露問題,咱們通常都建議只須要查看Profiler便可,只要Profile中的內存能夠保證正常升高和回落,那麼引擎這邊分配的內存就是沒有問題的。線程

2.    咱們作項目的時候發現有時profiler中System.ExecutableAndDlls這項佔用不少,有什麼解決辦法嗎?調試

「System.ExecutableAndDlls」該項顯示的是執行文件和所調用的庫(物理、渲染、IO等系統庫)的總和。請不用擔憂該選項的數值,由於不少Application均在共用這些庫,而且它對於真實遊戲的內存壓力很是小,並且也不會致使OS由於該內存來Kill掉遊戲。code

3.    爲何在Profiler中的Simple模式下,Used Total的數值不等於其右邊各項Unity,Mono,GfxDriver,FMOD與Profiler總和呢?遊戲

其實在Unity中,Used Total的計算公式爲Used Total = Unity + Mono + GfxDriver + Profiler + additionalUsedMemory。公式中的additionalUsedMemory項在profiler中並無顯示,由於這一項通常狀況下都爲0,只在某些特殊發佈平臺下才會有數值(通常Android,PC和IOS都爲0)。所以通常狀況下Used Total的值就是除FMOD以外各項的總和了。固然,這個規則對於Reserved Total是一樣適用的。內存

4.    咱們項目的資源主要使用AssetBundle動態加載資源,發現Profiler中Detailed模式下PersistentManager.Remapper一項佔用時多時少,這一項主要是作什麼的呢?

Remapper主要提供文件的持久化存儲,包括各類序列化的asset,項目的setting文件等,維護文件系統的中的文件與內存中數據的對應關係。那麼若是項目大量使用AssetBundle的話,在對AssetBundle進行Unload以前都會須要佔用Remapper的內存的。而Remapper自己的實現使用內存池,其數值只會增大,那麼爲了使Remapper佔用的內存保持在一個穩定的數值上,咱們須要每次在加載必定數量的AssetBundle以後進行Unload操做,而不要一次性把全部AssetBundle都加載後才調用Unload。(這樣的操做對維持整個mono heap的大小也是相當重要的,由於mono heap自己也是隻增大不減少的)

5.     咱們在Editor中調試項目的時候發現紋理的內存大小是其自己大小的兩倍,是由於Unity把內存和顯存的大小都計算進去了嗎?

其實並非這個緣由,由於Editor自己會保有紋理的一分內存,在Editor下進行profiler會把Editor自己所使用的紋理大小也計算進去,所以會有內存變爲兩倍的狀況。咱們官方並不建議在Editor下對項目進行性能調試,而是務必要在真機上跑編譯好的項目,而後鏈接profiler進行調試,只有這樣才能獲得真正精確的測試數據。

相關文章
相關標籤/搜索