Unity3D遊戲優化之頭頂UI

Unity3D遊戲優化之頭頂UI


3D角色頭頂會顯示文字、圖標、血條等,它會跟隨角色移動,始終朝向相機,可能還有定製的縮放,一般情況下會考慮用UGUI來做,但完成後發現這樣做的效率很低,而且遮擋正確性也保證不了。

效率低因爲:

1,渲染上每塊文字、圖片都要用一次drawcall,圖片文字又可能是交替出現的沒法利用dynamic batching,UGUI的渲染順序是hierachy從上到下,基本上必然交替出現。一個角色頭頂UI就可能要1至5+個drawcall,比角色自身的還多。

2,UGUI的元素都要放到canvas節點下,同步位置、朝向、縮放是很大的消耗,同時會觸發canvas重新刷新UI的vertex buffer,雖然是在其他線程上刷新的,但仍然很慢。如果每個頭頂UI都配一個canvas掛載角色節點下,實測發現性能更差。下圖是100個角色頭頂有圖標和名字的profiling,可以看到同步pose比整個遊戲的渲染還高

遮擋不正確因爲:頭頂UI屬於透明物體,需要從遠到近渲染,但是UGUI是根據Hierachy從上到下的,沒法根據遠近排序,這就會造成遠處角色的頭頂UI擋住自己角色的,看着彆扭,尤其在自由視角的遊戲中。

想要效率高必須得在一個drawcall裏渲染圖文,且能用到dynamic batching,dynamic batching是在渲染線程上進行的還能省主線程時間。不用UI而是當作一般3D物體渲染就能用到引擎的透明排序正確遮擋。

Unity自帶的TextMesh可以做到遮擋正確,但是沒法同時渲染圖文,也沒代碼可改,所以pass。

Asset Store上找下插件

TextMeshPro是很強大的插件,用SDF(signed distance field有向距離場)的方式使放大的文字銳利很多,但是不支持動態字體,只能是預先生成的bitmap裏固定的字,無法滿足常用漢字之外的顯示,又pass。以後可以說下SDF渲染文字的原理。

SuperTextMesh:能渲染動態文字,富文本支持圖文混排,缺點是支持atlas但很弱,資源管理、解析效率內存佔用都算不上優秀。好在有源碼可以改,就選這個了。


一個drawcall同時渲染圖文的方式就是用混合,一個材質帶文字和atlas兩張貼圖,用3套uv進行混合,uv1是文字的,uv2是圖片的,uv3表示混合權重,顯示文字的quad文字權重爲1圖片爲0,顯示圖片的quad文字權重爲0圖片權重爲1,sample兩張圖混合一下就行了。

性能比之前好很多,下面是2001個帶圖文的SuperTextMesh,2000個在時刻改變位置。合批到了4個drawcall,更新pose的腳本消耗有數量級的降低。


策劃想要的圖文基本都能搞定。國內挺多遊戲在優化的時候都會發現是UI的瓶頸,UWA的專家們也說見怪不怪了:D

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章