1. 程式人生 > >Camera和 tris,verts的優化

Camera和 tris,verts的優化

ref 的確 角度 field 矩形 details test 遇到 關系

Unity的Camera組件有很多可調節的參數,當需要做優化的時候,stats面板中的tris和verts這兩個重點項都與Camera組件的參數有很大關系,有些參數的意義Unity手冊說得不夠詳細,經過我們的測試和咨詢,把結論記下來,如果有不對歡迎留言~

Field Of View 這個值的範圍從1-179,是一個角度,具體是哪個角呢,是從Camera自身坐標系x軸方向看過去的紅色夾角,如圖所示,在這個角度下攝像機的遠近裁剪面與y軸平行

Clipping Planes 遠近裁剪面,就是下圖中梯形的下底和上底

技術分享

接下來是本文的重點,請大家仔細閱讀,我就一個常見問題,stats面板中顯示的GPU渲染的面數tris及頂點數verts到底如何計算出來的?

這個問題之所以常見是因為影響Unity渲染效率或者遊戲畫面是否卡頓的最關鍵指標,就是stats面板中的tris和verts,搞清楚這兩個指標的確切含義對於優化的意義不言而喻。

之前我一直以為這兩個數據就是模型落在camera梯形中的頂點數,後來發現並不是這樣,我把遠裁剪面弄得與近裁剪面很接近,或者調整 field of view 都會改變這個梯形的體積,裏面容納的頂點看起來沒有,但是stats面板裏的數據確一直有。如下圖,看起來這個梯形裏沒有頂點但是tris和verts的數據都顯示GPU渲染出了那個矩形,12個tris(空場景本身有2個tris,剩下矩形6個4邊面等於12個tris三角面)加24個verts(這個數字受多因素影響,不能從表現上解釋):

技術分享

camera 組件參數如下(註意field of view)

技術分享

當我改變 field of view 到 120 以上時候,在game視圖下我們就能看到那個cube了,換句話說,真正的結論就是:

Unity stats 視圖中的 tris 和 verts 並不僅僅是視錐中的梯形的 tris 和 verts,而是 field of view 所有取值下的 tris 和 verts,換句話說,哪怕你在當前game視圖中看不到這個 cube,如果當你把 field of view 調大到 179 過程中都看不到這個 cube,stats面板才不會統計,gpu才不會渲染,否則,都會渲染(見下圖),而且unity不會把模型拆分,這個模型哪怕只有1個頂點需要渲染,unity也會把整個模型都渲出來。

技術分享 技術分享

Unity 模型優化中很常見的一個問題就是美術用max做出來的模型,在max裏顯示面數和頂點數少於unity中的,或者出現不一致的情況,根據我們的實際項目經歷原因:

1)是max的數據顯示的是四邊面,而unity裏status面板裏的面tris是三角面,這兩個的對應關系我根據數據總結是三角面的數量是四邊面的2倍。

2)大家看一下這篇博主的文章 Unity 與 max 中頂點數面數區別的原因,其中提到的 Unity 這種將頂點一分為多的原因,主要有兩個:一個是UV splits,一個是Smoothing splits。我們遇到的主要是 UV split,用通俗的語言解釋就是UV 分割(max中用了幾張UV網),比如一個人,他的UV分為頭,身子兩部分,一個車UV分為窗戶,軲轆等等,UV分的越多,到Unity中的頂點數就會越多。所以最終的結果就是有的模型面多頂點少(如人物),有的模型面少頂點多(結構復雜的車),這也就解釋了為什麽max和Unity中模型的面數一般是一致的但是頂點數並沒有直接的對應關系。

3)不同的制作方式對模型最終到Unity裏也就是GPU的渲染下也會有不一樣的結果,下面上一組圖,三個不同顏色的加號,因為制作方式的不同導致了截然不同的渲染效率(而且這點往往和美術同學的認識相悖)

以下三個加號,綠的是兩個box橫豎穿插,紅的是一個矩形擠壓出橫向矩形,黃的是一個豎box加左右兩個橫向box刪掉橫向box與縱向重疊的面,具體表現大家看數據吧~

技術分享 技術分享 技術分享

Camera和 tris,verts的優化