天天看點

技術分享連載(五)UI圖形渲染記憶體管理資源管理圖形渲染

Q1:能否在NGUI多分辨率适應方面提供一些解決方案或者思路?

多分辨率适應涉及到以下幾個方面: 布局。通常可以通過 NGUI 中的 Anchor 元件來實作,能夠保證 UI 到螢幕上指定錨點的距離; UI 背景圖比例。通常我們建議将背景圖的長寬比放大,以适配不同長寬比的螢幕,但要注意兩邊需要留白,或者保留可被裁掉的元素; UI 的整體縮放。可以通過 UIRoot 元件的 Scaling Style 來統一配置。 需要提醒的是,不同類型的遊戲對布局的需求通常也不同,是以還是需要結合實際開發情況來做調整。

Q2:請問Unity引擎中使用什麼貼圖壓縮格式,可以保證在占用記憶體相對較小的情況下True Color效果和原圖相當?同時在iOS和Android平台上圖檔的壓縮格式分别用什麼比較合适?有什麼需要注意的地方嗎?

目前來講,并不存在一個所有GPU平台都支援硬體解壓的壓縮格式。 ETC1 和 PVRTC 分别是Android和iOS上我們最推薦的格式。 但對于透明紋理,ETC1不支援,而 PVRTC 則可能有較大失真,是以更推薦使用 RGBA 16。 一般來說建議直接使用 Unity 預設的壓縮格式(即選擇 Compressed 即可,不需要做特殊設定),Unity 會做如下處理: Android 上不帶Alpha通道的圖檔采用 ETC1,帶Alpha通道的圖檔采用True Color中的RGB16,TrueColor中的 RGBA16 會>比 RGBA32 更節省空間,但圖像的顯示品質會差一些; iOS 上使用 PVRTC,但PVRTC格式要求紋理的長寬相等,且都是2的幂次(即POT,在ImportSettings中可以将NPOT的紋理自動轉換成POT)。 另外,針對Android 上的帶Alpha通道的圖檔,還有一種常見的做法,即把Alpha通道獨立出來作為另一張紋理,進而将 RGB 部分和 Alpha 部分分别采用 ETC1來壓縮,但渲染時就需要自定義的 Shader來處理。 同時,我們不建議直接使用 RGBA32 格式的紋理,因為它占用了很大的記憶體。一般建議使用 RGBA16 和 ETC 格式的紋理來進行加載。 如果轉換到 RGBA16 格式時出現了類似“色階”的顔色問題,則建議盡可能避免大量的過渡色使用。

Q3:在UWA的幫助下,我們追蹤到了一個Reserved GFX的記憶體占用,并且顯示比較高。我們應當如何降低該記憶體占用呢?

一般來說,Reserved GFX 中的記憶體,主要是紋理和網格資源,可以嘗試對紋理格式進行檢測,盡可能使用硬體支援的壓縮紋理;而對于網格資源,則可以從減少頂點或者頂點屬性入手。 具體資訊也可以檢視UWA文檔。 另外,更重要的是檢測紋理和網格資源是否存在備援(多份一樣的資源)或者洩露(比如,主城中的大紋理出現在戰鬥場景中),這是需要極力避免的。關于資源備援、記憶體洩露,開發者可以參考我們之前的文章《 性能優化,進無止境---記憶體篇(下)》。

Q4:請問遊戲中特效使用的很多貼圖, 一般有什麼好的方式去管理嗎 ? 不合并圖集的話會有上千張小的透明貼圖, 合并圖集又會有占用記憶體過多的問題。

可以合并成Atlas,一般将盡可能同時出現頻率較高的Texture合成Atlas,這樣并不會造成記憶體過大。在這方面也可以參考我們前不久推薦的插件Mesh Baker。

Q5: 在Unity開發中,大規模使用粒子特效會有什麼問題 ?如何去針對性的優化?

普遍來說,會造成Draw call高、渲染開銷大、CPU高等問題。下圖就是UWA性能診斷系統對粒子系統檢測的幾個注意點。
技術分享連載(五)UI圖形渲染記憶體管理資源管理圖形渲染

原文出處:侑虎科技

轉載請與作者聯系,同時請務必标明文章原始出處和原文連結及本聲明。

繼續閱讀