ios开发中计算代码运算时间_理解Unity中的优化(二):内存
內存:
內存消耗是一個關鍵的性能指標,尤其是在內存資源有限的平臺上,比如低端移動設備。
內存消耗分析:
在Unity中診斷內存問題,Unity介紹了一款開元的可視化內存分析工具——MemoryProfiler,地址:https://bitbucket.org/Unity-Technologies/memoryprofiler
這個工具兼容了Unity高于5.3的所有版本。在對用IL2CPP編譯出來的游戲進行內存分析時,它能捕獲到很多托管代碼內存消耗的信息。
要使用MemoryProfiler,先用IL2CPP打包一個簡單的項目,安裝到測試機上。連接上Unity的Profiler,并且打開內存分析窗口,選擇Take Snapshot。
當數據被收集并傳輸到Unity編輯器時,運行的游戲會有短暫的停頓。然后,Unity編輯器會解析接受到的數據,這可能需要大量的時間。對一款占用內存較多的游戲來說,這可能會花10-30分鐘。
Unity建議我們耐心等待。當然,這需要我們自己作出衡量,用這款工具或者使用其他內存分析工具。
上面的屏幕截圖取自IOS設備上的一個Unity標準庫中的場景。它展示了四分之三的內存都是被飛機機身的貼圖占用了。點積上圖中的每個小方塊,就能獲取到詳細的信息。
識別重復的貼圖:
在項目開發中,我們會遇到的共同問題就是內存中的重復資源,表現最為明顯的,就是貼圖重復。
通常,如果兩個資源的類型和大小相同,那么它們可能加載自同一資源,可能就是重復的資源。在MemoryProfiler的面板中,對于看起來差不多的兩個對象,可以檢查Name和InstanceID這兩個字段。
Name字段不多說,InstanceID是Unity運行的時候被分配的,這個值是唯一的。
上圖是展示貼圖重復問題的一個簡單示例,取自MemoryProfiler5.4版本。
圖中內存中加載了兩份貼圖。這兩份貼圖具有相同的名稱和大小,這可能就出現了貼圖重復的問題。然后,檢查項目中名為“wood-floorboards-texture”的貼圖,發現只有一份。就可以確定資源已經重復加載了。
每一個UnityEngine.Object對象,在創建完成的時候,都會被賦予一個唯一的Instance ID。上圖中的兩個貼圖具有不同的Instance ID,可以確定它們代表了兩組不同的貼圖數據被加載到了內存中。
但是這兩個貼圖的大小和名稱是相同的,只有Instance ID不同,就可以確定這兩個貼圖加載自同一貼圖,而且在內存中已經重復加載了(注意:如果項目中的兩張貼圖具有相同的文件名,那么我們只通過文件名來判斷就會出現問題,所以我們還需要比較資源的大小)。
AssetBundle中的資源重復:
AssetBundle中的資源重復問題大多數是由于沒有正確的卸載AssetBundle包導致的。詳細的描述可以參考Unity的官方文檔
A guide to AssetBundles and Resources - Unity?unity3d.com重點參考上文中的AssetBundle usage patterns章節。
檢查image buffer, Image Effect & RenderTexture內存使用:
在MemoryProfiler中,也可以看到Image Effect和RenderTexture的render buffers占用的內存大小。
上面的截圖展示了一個簡單的場景,其中應用了一些攝像機后期效果(Cinematic Image Effects)。這部分圖像效果為了執行各自的運算,會分配臨時的渲染緩沖(render buffer),尤其是光暈效果(Bloom effect)會分配多個遞減大小的緩沖。由于IOS設備的高清視網膜技術,這些臨時的緩沖會比項目中的其他資源消耗更多的內存。
一個全屏的臨時渲染緩沖區會占用24-36MB內存。這取決于緩沖區的格式。在不影響視覺效果的前提下,我們可以調小渲染緩沖的大小來減少內存的占用。
優化圖像特效占用的臨時緩沖區和其他GPU資源的另一種方法是創建一個單一的“uber”Image Effect,讓它執行所有不同的計算。當使用Unity5.5或者更新版本時,也可以使用UberFX(可以從github中獲得,地址:https://github.com/Unity-Technologies/PostProcessing)。下載包中提供了一個可配置的“uber”Image Effect,它能執行所有的攝像機后期效果的運算,而且占用的資源要比單個的Image Effect要少。
本文內容來自Unity官方文檔:
Unity - Manual: Memory?docs.unity3d.com作者水平有限,如有錯誤請多加指正。
總結
以上是生活随笔為你收集整理的ios开发中计算代码运算时间_理解Unity中的优化(二):内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python小白的数学建模课-05.0-
- 下一篇: Python数模笔记-NetworkX(