在使用Unity開發游戲的過程中,借助Profiler來分析內存使用狀況是至關重要的。但許多開發者可能還對Profiler中各項數據表示的含義不甚明確,Unity官方的技術工程師柳振東,將針對Profiler內存分析相關的問題及解答,與大家進行分享。
要想完全發揮Profiler內存分析的威力,首先要做的就是了解Profiler展示的數據所表達的含義,以及到底哪些模塊所使用的內存才會被統計到Unity的Profiler中。Profiler涉及到的知識點還有很多,我們今天先從中挑選一些大家常有的疑問來作解答。
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掉游戲。
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進行調試,只有這樣才能得到真正精確的測試數據。
-
內存
+關注
關注
8文章
2998瀏覽量
73882 -
Unity
+關注
關注
1文章
127瀏覽量
21773
發布評論請先 登錄
相關推薦
評論