天天看點

技術分享連載(十四)UI輸入圖形渲染骨骼動畫資源管理記憶體管理

Q1:能否對提升NGUI的渲染效率提供一些思路?

開發團隊可以從以下幾點入手: 1、通常一個Panel會産生1個或多個Draw Call,以一個Panel為機關,Draw Call 的數量通常由目前 Panel 中使用的Atlas、Font的數量所決定。 2、要降低UI渲染時的 Draw Call數量則需要對 Atlas 的制作進行合理的規劃,即在保證使用較少的 Atlas 的同時,還需要保證 Atlas之間不會存在交叉遮擋。 3、要注意UI Texture的使用,每個UITexture自身會占用一個Draw Call,同時如果其Depth值穿插在了其他來自相同Atlas的UISprite中,還會導緻Draw Call的打斷,造成不必要的額外Draw Call。 4、另外還可以借助Panel Tool和Draw Call Tool來對UI部分的Draw Call進行分析,前者可以顯示每個UIPanel包含了多少個Draw Call,而後者可以顯示每個Draw Call由哪些UIWidget組成。

Q2:如下圖所示,第一張顯示的是沒有烘培Lightmap的場景效果,裡面有一盞點光源;第二張顯示的是烘培Lightmap後的場景效果。請問為什麼同一盞點光源照亮的效果差别那麼大?

技術分享連載(十四)UI輸入圖形渲染骨骼動畫資源管理記憶體管理
技術分享連載(十四)UI輸入圖形渲染骨骼動畫資源管理記憶體管理
簡單來說,這就是實時的直接光照和全局光照的差别。 在渲染時前者隻能處理光源和單個物件之間的直接光照,而後者在烘焙時是通過光線跟蹤或者輻射度等複雜算法,計算出所有物體各個表面之間互相反射的光照資訊,這也是烘焙Lightmap需要較久的時間的原因 。可以發現在全局光照下,即使是物體的背面也會因為其它表面的反射而被照亮,這在直接光線下就無法實作這樣的效果。

Q3:在UWA給出的報告中,我們發現了Animator過高的情況,其中UI和角色各占一半。我們之前一直選擇CullUpdateTransforms,通過閱讀Unity官方文檔發現CullCompletely更符合我們的現狀,想請教下如果我們選擇CullCompletely可能會有什麼隐患呢?

使用 CullCompletely 在開啟 RootMotion 時是需要注意的,比如人物有一個巡邏動畫是通過 RootMotion 制作的,那麼在人物走出螢幕後,其動畫就停止了,即不會再走回螢幕中。

Q4:我有一個UI預設,它使用了一個圖集, 我在打包的時候把圖集和UI一起打成了AssetBundle。我在加載生成了GameObject後立刻解除安裝了AssetBundle對象, 但是當我後面再銷毀GameObject的時候發現圖集依然存在,這是什麼情況呢?

這是很可能出現的。unload(false)解除安裝AssetBundle并不會銷毀其加載的資源 ,是必須調用 Resources.UnloadUnusedAssets才行。關于AssetBundle加載的詳細解釋可以參考我們之前的文章:你應該知道的AssetBundle管理機制。

Q5:我們現在有一個場景,Draw Call和面數都在正常範圍内,Camera的距離也和其他場景一樣,但是VBO卻非常高。下圖是該場景的資料情況,該場景下有很多複用的模型,如果不勾選Static那VBO會下降,但是Draw Call會上升。那我能否通過合并模型的方式把VBO降下來呢?

技術分享連載(十四)UI輸入圖形渲染骨骼動畫資源管理記憶體管理
當你勾選Static時,Unity 會将其進行 Static Batching,進而将生成一個較大的VBO來進行渲染,同時降低Draw Call。而如果不勾選時,則引擎無法對其進行Batch,是以VBO會降低,而Draw Call升高。 對此,我們的建議如下: 1、一般來講,降低Draw Call的意義大于降低VBO; 2、在Draw Call較低的情況下,比如目前的50+,可以考慮适當增加一些Draw Call來降低VBO的占用,一方面可以降低帶寬的壓力,另一方面也可以适當降低一些記憶體。

原文出處:侑虎科技

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

繼續閱讀