這是摘自Unity官方文檔有關(guān)優(yōu)化的部分焦匈,原文鏈接:https://docs.unity3d.com/Manual/BestPracticeUnderstandingPerformanceInUnity.html
總共分為如下系列:
- 采樣分析
- 內(nèi)存部分
- 協(xié)程
- Asset審查
- 理解托管堆 【推薦閱讀】
5.1 上篇:原理嗡害,臨時分配內(nèi)存盛险,集合和數(shù)組
5.2 下篇:閉包,裝箱邢享,數(shù)組 - 字符串和文本
- 資源目錄
- 通用的優(yōu)化方案
- 一些特殊的優(yōu)化方案
內(nèi)存消耗是關(guān)鍵的性能指標趣竣,尤其對于在內(nèi)存資源非常有限的設(shè)備上蓖租,如移動設(shè)備。
剖析內(nèi)存消耗
分析內(nèi)存問題最好的工具是Unity在Bitbucket上開源的工具:
https://bitbucket.org/Unity-Technologies/memoryprofiler饭玲。
只需要下載對應(yīng)的代碼倉庫將其放到項目中的Editor目錄下即可侥祭。
注意,這個工具在Unity5.3之后的版本都可以使用茄厘,如果應(yīng)用是用IL2CPP打包的矮冬,它可以提取原生代碼和托管代碼的內(nèi)存消耗信息。
使用這個工具次哈,需要使用IL2CPP工具進行打包并且發(fā)布到合適的設(shè)備上胎署,然后連接上編輯器中的CPU剖析工具,打開內(nèi)存剖析界面(Window > MemoryProfilerWindow)選擇Take Snapshot窑滞。
設(shè)備上收集數(shù)據(jù)琼牧,并將這些數(shù)據(jù)發(fā)送給Unity編輯器,應(yīng)用會暫停一段時間葛假。然后Unity編輯器開始分析數(shù)據(jù)障陶,這也需要比較久的時間。對于內(nèi)存比較敏感的應(yīng)用聊训,這個過程可能需要10-30分鐘完成抱究。
在解析數(shù)據(jù)和加載的過程中,建議各位耐心等待带斑。
上面的截圖來自于iOS設(shè)備上運行的標準Asset場景鼓寺,顯示了四分之三多的內(nèi)存給了四個非常大的飛行器的機身紋理貼圖勋拟。
這個可視化的工具也可以被放大。點擊每個方塊可以獲得更多的相關(guān)信息妈候。
定位重復(fù)的紋理
最常見的內(nèi)存問題是在內(nèi)存中的資源重復(fù)敢靡。紋理是最占內(nèi)存開銷的資源類型,紋理重復(fù)是Unity項目中最常見的問題苦银。
如果兩個對象是相同大小啸胧,相同類型,那么很有可能這兩個對象是從同一個Asset加載進來的幔虏。在新的內(nèi)存剖析器中纺念,可以通過Name和InstanceID觀察查看資源。
Name是加載進來的Asset文件的名稱想括,通常不帶路徑名和后綴陷谱。InstanceID是Unity采用的內(nèi)部識別編號,在Unity運行的過程中瑟蜈,這個編號是獨一無二的烟逊。
這張圖示范了資源重復(fù)的一個例子。圖形的左邊和右邊是從Unity5.4的內(nèi)存剖析器中的某個細節(jié)面板铺根。兩張圖的Asset實際上是內(nèi)存中兩個分開加載的紋理資源宪躯,名字和大小相同∫亩迹可以在Assets目錄下搜索資源名字眷唉,確認是否只有一個資源較這個名字,從而確定是不是資源重復(fù)加載囤官。
內(nèi)存中每個獨立的UnityEngine.Object都有獨特的instance ID冬阳,當Object被創(chuàng)建的時候指定。這兩個紋理有不同的Instance IDs党饮,所以它們代表了兩份不同的紋理數(shù)據(jù)肝陪。
因為Asset的大小和名稱相同,而InstanceID不同刑顺,所以可以確定一個紋理被加載了兩次氯窍。雖然有可能會出現(xiàn)兩個同名的資源文件,所以還是按照文件大小來判定蹲堂。
AssetBundle和Asset重復(fù)
紋理資源和Asset重復(fù)的最大原因是AssetBundle的不合理使用狼讨。可以參見AssetBundle相關(guān)的知道柒竞。關(guān)鍵章節(jié)是管理已經(jīng)加載的Asset政供。
檢查圖片緩沖區(qū),圖片效果和RenderTexture內(nèi)存使用
同樣也可以在剖析器中看到為圖片效果和RenderTexture提供渲染緩沖區(qū)占用的內(nèi)存大小。
上面的截圖展示了使用了Unity電影圖片效果的一個場景的內(nèi)存剖析器的情況布隔。這個圖片效果分配了臨時渲染緩沖區(qū)离陶,而且Bloom效果分配了多個緩沖區(qū)。因為iOS設(shè)備的高分辨率衅檀,這些臨時緩沖區(qū)占用了非常多的內(nèi)存招刨,比項目中剩下的占用的總數(shù)還多。
考慮到iPad Air2的分辨率是2048x1536哀军,比大部分終端設(shè)備和PC的1080p的分辨率高出了很多沉眶。全屏的臨時渲染緩沖區(qū)差不多消耗24MB~36MB,取決于緩沖區(qū)的格式排苍。降低渲染緩沖區(qū)的像素大小可以節(jié)省75%的內(nèi)存消耗沦寂,同時也不會對最終的效果造成很大的影響学密。
優(yōu)化圖片效果淘衙,減少臨時緩沖區(qū)和其他的GPU資源的消耗另一個優(yōu)化方法是創(chuàng)建單個“uber”圖像效果一次執(zhí)行所有不相干的計算。如果使用Unity5.5或者更新的版本腻暮,可以使用新的UberFX彤守。
參見資料:https://github.com/Unity-Technologies/PostProcessing
這個例子提供了一個可以配置化的“uber”圖片效果,可以執(zhí)行Cinematic Image Effect的所有操作哭靖,相比普通的獨立Image Effect可以節(jié)省不少資源具垫。
如果覺得文章對您有用,請點個贊唄试幽!???