Related Posts Plugin for WordPress, Blogger...

6-18 Polygonal Culling

本章要來介紹這款插件『Polygonal Culling』,這款插件可以根據攝影機的角度,將場景上的物件進行多邊形剔除,Unity內建的Occlusion Culling只能夠針對整個物件的顯示或隱藏,無法細分成小的多邊形。Polygonal Culling的原理是自動將物件的Mesh分割成多個細小的物件,然後再配合Unity的Occlusion Culling功能。


首先,如下圖,遊戲已開啟Unity內建的Occlusion Culling功能。

接著,請記得要自己安裝好插件,然後選擇NGSTools Polygonal Culling。

此時場景上會自動建立一個GameObject名為Polygonal Culling。

選擇以後於Inspector視窗能看見Open window的選項。

點選以後會跳出一個使用視窗,有作者介紹,請選擇Let's start。

Max Stack應是指切割的深度,該值設越高,Block數量會越多。Min Triangles Count則是指一個Block內的Triangle數量,該值越高代表切割的程度越簡單。此處我使用作者影片中的預設值,後半段我會再針對這兩項數值進行更深入的實驗。接著按下Visualize按鈕。

接著會自動針對場景中為Static的物件進行判別,分割Block區域。好了以後選擇Next。

Culling type選擇Standard Occlusion,為什麼要跟Unity內建的Occlusion配合?因為我的地形系統使用Terrain,只有內建的Occlusion才可以搭配,Polygonal Culling插件對Terrain不起作用。

接著選擇Bake。

接著試驗看看吧,實際執行遊戲以後,發現火堆會依據主角的位置,只產生部分3D物件。

若未使用Polygonal Culling,則會顯示完整的火堆物件。

消失的時候也會整個消失。

如圖為村莊的部分。

見圖片左下角的房屋,主角靠近的時候,後半段因為比較遠又看不見,所以那部份的3D物體並沒有被Render。

特別好處是,我的遊戲中雖然是固定3D視角,但是經過特定場景時會切換原本的固定鏡頭,切換的瞬間就會因為要大量Render 3D物件,導致FPS驟降。

 使用Polygonal Culling後,在這方便的效能改進特別明顯,原本FPS驟降的問題也有改善。如下圖可見,鏡頭旋轉時,只會顯示部份的房屋,而不會整個房屋都顯示出來。

接下來要來比較Polygonal Culling的Max Stack與Min Triangles Count兩個參數。首先我以上面實驗的範例數值為基底,然後比較個別參數增長後的效能改善狀況,比較的時候以前面提到的鏡頭旋轉瞬間FPS為主。

基底數值
Max Stack:15
Min Triangles Count:150

首先,比較Max Stack於15, 30, 60的效能變化,固定Min Triangles Count為150。

Max Stack為15時,Block切割如下圖。

Max Stack為30時,Block切割如下圖。

Max Stack為60時,Block切割如下圖。

Max Stack為15時,碎片化數量為629。

Max Stack為30時,碎片化數量為1158。

Max Stack為60時,碎片化數量為1161。

Max Stack為15時,瞬間FPS為57.6,Batches為152,Tris為173.9k。

Max Stack為30時,瞬間FPS為49,Batches為146,Tris為174.0k。

 Max Stack為60時,瞬間FPS為59,Batches為142,Tris為172.2k。

綜上來看,Max Stack到60的時候,切割上已經沒有太大的差別,雖然最後執行時的FPS略有改善,但因為有實驗環境只執行一次的限制,這樣的實驗其實是不精確的,可以說大概都是在誤差值內,效果差不多。另一方面,切割數量也可能與3D物件的數量有關,這部分的實驗就暫時先不進行測試了。總之,碎片化數量的增加無法對效能達到顯著改善

接著來比較Min Triangles Count於150, 300, 600的效能變化,Max Stack固定為15。由於Min Triangles Count為150,Max Stack為15的數值上面已經有了,我就不再多比較了。

Min Triangles Count為300時,碎片化數量為419。

Min Triangles Count為600時,碎片化數量為261。

Min Triangles Count為300時,瞬間FPS為61.8,Batches為148,Tris為175.9k。

Min Triangles Count為600時,瞬間FPS為53.1,Batches為139,Tris為173.7k。

綜合上述實驗來看,分別表現最好的情況為Min Triangles Count為300,Max Stack為60。因此底下再以最好情況的Polygonal Culling與完全沒使用Polygonal Culling進行比較。

Min Triangles Count為300,Max Stack為60,瞬間FPS為70.2,Batches為149,Tris為173.2k。

完全沒使用Polygonal Culling,瞬間FPS為56,Batches為139,Tris為171.2k。

使用Polygonal Culling可以有效改善我的遊戲中,攝影機旋轉時的FPS

以此來看,Polygonal Culling並非隨著細分的精密度提高而增進效能。由於過多細化的Mesh會導致Batching的工作增加。所以,Polygonal Culling雖降低了GPU的工作量,卻可能增加了CPU的工作量。從Saved by batching的值便能看出Unity在Batching的工作量上的不同。未使用前為44,使用最佳化Polygonal Culling後增加到429。

應追求效能上的平衡,尤其我的遊戲中效能瓶頸主要發生在攝影機旋轉的時候,瞬間載入大量3D物件造成Draw Call上升,Polygonal Culling能有效改善此問題。但是,過多的細化Mesh會導致平時的CPU負擔過大,應注意。

留言