作者:Ian
翻譯: Kelvin Lo / 海龜
系列回顧:
Unity3D性能優化最佳實踐(一):分析
內存的消耗是關鍵性的指標,尤其是在像低階手機這種內存有限的平臺。
在 Unity 檢查內存的問題最好用 Unity 放在 Bitbucket 上開源的內存檢查工具。整合這個工具到 Unity 很簡單,只要下載解開之後把裡面的Editor目錄拉進項目即可。
這套工具適用於 Unity 5.3 之後到目前的版本(Unity 5.6),當它連到 IL2CPP 建置的項目時可以捕捉到原生跟非原生程序內存耗用的信息。
裝好工具後確定項目設定是用 IL2CPP 編譯,把項目放到設備上執行後和 Unity 編輯器的 Profiler 窗口連接,然後打開 Memory Profiler 窗口(套件有裝好的話從 Window > MemoryProfilerWindow 開啟),並單擊 Take snapshot。
在數據收集並傳回 Unity 時,設備上的應用程式會暫停一段時間。然後 Unity 編輯器會開始解析接收的數據,這會需要一些時間。對於用了海量存儲器的項目有可能會花上 10-30 分鐘。
解析過程中請耐心等候
上圖是用 iOS 裝置執行 Standard Assets 裡的場景,顯示超過 ¾ 的內存用量來自於四張很大的貼圖,查出是飛機的機身相關貼圖。
這個圖表每一項都可以縮放,點進去能看更詳細的信息。
一個比較常見的內存問題是資源重複加載,貼圖通常是佔用內存最密集的資源,貼圖重複也是在 Unity 項目裡最常發生的問題之一。
要找出是否有貼圖重複加載可以透過比對內存裡是否有兩個相同類型和大小的對象並檢查是否是從同一個來源加載的,在新版的 Memory Profiler 的接口裡,可以比對看起來相同對象的 Name 和InstanceID 字符串。
Name 欄位表示的是加載對象的素材文件名,一般來說就是檔名(不含文件夾路徑跟擴展名)。InstanceID 表示的是由 Uinty 執行時分配的內部編號,這個編號會是每次執行產生的唯一編號。(注一)
上圖是一個簡單的案例表示,圖的左右兩側是在 Unity 5.4 裡用 Memory Profiler 所抓取的數據,圖中顯示的資源分別是在內存加載的兩張貼圖。兩張貼圖具有相同名稱和大小,代表它們可能是重複的。檢查了 Assets 目錄和其子目錄之後,只找到一個名為 wood-floorboards-texture 的圖檔,因此這非常有可能就是重複加載資源的問題。
內存裡每個單獨的 UnityEngine.Object 都會在建立時分配一個唯一的 InstanceID,由於這兩張貼圖的 InstanceID 並不同,所以可以確定它們是兩份不同的加載內存的貼圖數據。
由於檔名和大小相同 InstanceID 卻不同,因此可以判定這是重複加載的貼圖。(注二)
一般來說造成貼圖和資源重複加載內存最有可能的元兇是不正確的AssetBundle 卸除,關於這部分可以參考官網的 AssetBundles 最佳實踐系列文章,關鍵在於管理加載的資源這個章節。
檢查 Image Buffer、Image Effect 和渲染貼圖內存的使用情況
用 Memory Visualizer 你還能看到從渲染暫存區(Renderbuffers )提供給 Image effect 和 RenderTexture 對象的內存使用情況。
上圖是一個單純帶有一些 Image Effects 的場景所擷取的數據,Image Effects 為了要計算在內存配置了暫用的渲染暫存區,比較特別的是 Bloom 效果配置了一系列的暫存區。由於 Retina iOS 設備解析度很高,造成這些臨時暫存區消耗的內存比項目其他部分加總還多。
設想 iPad Air 2 的原生解析度是 2048x1536,這已經超出新一代的遊戲機和 PC 標準的 1080p,但卻要在平板上執行。取決於暫存區的位深度不同,一個全屏幕的 Render buffer 可能會用掉整整 24mb甚至 36mb 的內存空間。想要降低這個值可以把 Render buffer 的解析度減半,可以降低約 75% 的內存耗用,通常視覺上來看差別也不會太大。
要改善 Image Effects 佔用太多 Render buffer 和 GPU 資源的方法,可以採用 Unity 5.5 或以上版本支持的 「uber」 Image Effect,官方提供一個名為UberFX 的套件可以把許多不同層的 Image Effect 迭加在一起成單一一個效果後才送去運算, 能減少更多的開銷。
注一:請注意,編號是執行周期產生分配,同項目不同執行周期編號也不會相同。
注二:注意:如果在項目中有相同名字的貼圖,那這裡就要小心是否判斷錯誤,但相同名稱又相同大小的機率不高,仍可作為依據。
熱議丨無止盡加班的代價有多大?
程序丨這些你都看過了嗎?年度盤點top40
如何用代碼快速寫出一個排位榜?教程大公開
想讓你的遊戲運行速度快10倍?你要這樣做!
……
添加小編微信,發送【程序】,可享雙重福利
1.加入GAD程序猿交流基地,獲取行業乾貨資訊,觀看大牛分享直播
2.直接領取60G獨家程序資料庫,地址在小編朋友圈
包括騰訊內部分享、文章教程、視頻教程等全套資料
↓長按添加小編GAD-沫沫↓