#每天一個小目標#Unity技術分享(八)

【技術小札】是UWA推出的技術交流欄目,我們會將開發團隊中反饋的常見問題加以總結並梳理在此,以供大家參考。同時如果你也是個熱愛分享、願與大家抱團進步的程序員,歡迎加入UWA的QQ群(465082844),與我們奇文分享,疑義相析。

運行性能

Q1:在報告中我們看到函數uwa-xxx是我們加的自定義代碼段採樣, 我們發現它們觸發了很多GC, 是什麼情況呢?

說明這些函數中會經常分配大量的堆內存 。GC是Mono來控制的,當Mono認為累積堆內存較高時,它就會調用GC。同時,哪個函數在分配堆內存時觸發了Mono的GC,該GC調用就會被算作是哪個函數調用的。所以如果經常被特定函數來觸發GC,那麼從概率上來說這個函數或這個代碼段分配的堆內存相當高。

資源管理

Q2:下圖一是剛進遊戲時獲取的信息,第二張是開關幾次同一個UI界面後獲取,對比兩圖我們發現有多份重複的Texture。請問這是為什麼?我們的載入方式是UI通過AssetBundle載入,載入後會釋放AssetBundle,然後再次載入 UI 就會造成紋理資源的冗餘。

  • 剛進遊戲時獲取的圖中出現的「重複」資源可能並不是冗餘,因為 Atlas的一個 Group 中可能包含多張一樣大小的Page(即紋理),而這幾個Page在內存中的名字是一樣的。

  • 但是,如果同一UI界面多次開啟後,內存中出現了更多同樣的資源,則說明UI的管理方式存在一定問題。對於頻繁使用的UI,我們建議在載入之後通過緩衝池對其進行緩存,後續使用時,直接通過緩衝池獲取即可。而不要每次均通過AssetBundle進行載入,這種做法既會造成更大的CPU佔用,同樣會很大幾率造成資源的冗餘。

  • 同時,如果多次開啟的是不同UI界面,並且造成內存中同種資源的增加,則很有可能是UI在AssetBundle打包時形成了冗餘(這種情況在目前的UGUI系統中較為常見)。對此,如果開發團隊使用的是UGUI,那麼我們的建議如下:

  1. 對於使用Unity 5.x的新AssetBundle打包系統,則打包時儘可能將同種Atlas的UI界面打成一個AssetBundle文件,否則將很有可能出現資源冗餘的情況;
  2. 對於使用Unity 4.x的老AssetBundle打包系統,則可以將一個含有Atlas的Prefab(或其他Object)先打包,其他UI元素對其進行依賴即可。
  • 此外,開發團隊可以考慮用 WWW.LoadFromCacheOrDownload 來載入共享包,因為 new WWW 的方式會在內存中形成 WebStream 造成較多的內存開銷。關於該函數的具體優劣,開發者可以參考你應該知道的AssetBundle管理機制。

內存管理

Q3:我們在UWA報告中看到有拼合粒子系統和未拼合粒子系統,請問如何拼合粒子系統?有沒有什麼規則呢?

粒子系統的Draw Call動態拼合與半透明物體的動態拼合機制相當(粒子基本都是半透明材質)。而對半透明物體,由於其渲染順序的限制(必須從後向前渲染,以保證渲染結果的正確性),動態拼合只能對渲染順序相鄰且材質相同的物體有效。而在決定半透明物體的渲染順序時,Unity首先會按Shader中的RenderQueue進行排序;其次(相同RenderQueue時),會根據每個半透明物件到屏幕的距離,距離大的優先渲染。

因此,需要儘可能地將相同材質的粒子系統放在比較接近的深度下,才能更多地使動態拼合生效。但通常由於相機的運動、粒子系統的分散分布等原因造成粒子系統之間的穿插,能夠動態拼合的數量往往都是很少的,所以我們在粒子系統模塊看到的開銷分布通常類似該圖,主要都是未拼合粒子系統造成。

運行性能

Q4:項目中勾選Static Batching和不勾選對效率有多大影響?我們在使用中發現勾選了以後包大小會增大一倍。如果不勾選,和自己在代碼中調用StaticBatchingUtility.Combine的效率有多大區別?

  • 如果在Editor中進行勾選,則會在項目中生成一個較大的VBO,Runtime時通過該VBO來進行渲染,優點是有效減少了Draw Call,缺點是增大了發布遊戲包的體積。
  • 如果在Runtime通過腳本來進行Batching,則相當於把拼合的時間由Editor中搬到了Runtime,所以載入時間(一般在場景載入時執行Batching)會稍有增加,但遊戲包的體積將相應減少。

內存管理

Q5:我們在Profiler中發現了一個AssetDatabase的內存佔用,其存在於Assets中,單個佔用內存非常大。 請問該佔用是如何發生的呢?是否可以避免?

理論上開發者在真機運行項目時是不會看到此選項的,只有在 Editor 中運行時能看到。由於在 Editor 下運行遊戲時,Profiler 中獲取的內存是包含了 Editor 本身佔用的內存的,因此並不準確,建議連接真機來進行內存的查看。

推薦閱讀:

重磅 | UWA性能診斷又添新利器,開啟資源優化新篇章 !
3.幸運撲克——寫第一個撩妹手機遊戲
手機遊戲是否一定要比端游和頁游更碎片化?為什麼?
報名| UWA DAY 2017 精彩議題曝光,重磅嘉賓揭曉!
求教一年unity3D經驗需要掌握哪些知識?

TAG:Unity游戏引擎 | 性能优化 | 手机游戏开发 |