【unity優化五】GPU

1、GPU作用:負責整個渲染流水線。它會從處理CPU傳遞過來的模型數據開始,進行Vertex Shader、Fragment Shader等一系列工作,最後輸出屏幕上的每個像素。因此它的性能瓶頸包括頂點、像素、顯存等因素有關。

2、頂點優化

   1)優化幾何體

        unity-game視圖-stats頁籤可觀察三角形數目和頂點數目。

       方案:儘可能減少模型中三角形的數目,一些對於模型沒有影響、或是肉眼非常難察覺到區別的頂點都要儘可能去掉。

       方案:儘可能重用頂點。在很多三維建模軟件中,都有相應的優化選項,可以自動優化網格結構

       方案:unity與三維軟件在計算頂點上的區別,前者站在GPU角度,後者站在人的角度;有時在GPU看來一個頂點要分開處理,因爲頂點的每一個屬性和頂點之間必須是一對一的關係,即空間位置上重疊的一個頂點可能會有不同的屬性,主要考慮兩個方面:UV splits和Smoothing splits。UV splits的產生,是因爲建模時,一個頂點的UV座標有多個;例如在不同面上,同一個頂點的UV座標可能發生改變。Smoothing splits的產生也是類似的,不同的是,這次一個頂點可能會對應多個法線信息或切線信息。解決方案是對於兩個面交接的一個邊,採用Smooth Edge不用Hard Edge,以避免冗餘的紋理信息。

    2)使用LOD(Level of detail)技術

       LOD技術有點類似於Mipmap技術,不同的是,LOD是對模型建立了一個模型金字塔,根據攝像機距離對象的遠近,選擇使用不同精度的模型。它的好處是可以在適當的時候大量減少需要繪製的頂點數目。它的缺點同樣是需要佔用更多的內存,而且如果沒有調整好距離的話,可能會造成模擬的突變

       在Unity中,可以通過LOD Group來實現LOD技術。菜單Component-Rendering-LODGroup

    3)使用遮擋剔除(Occlusion culling)技術

       遮擋剔除是用來消除躲在其他物件後面看不到的物件,這代表資源不會浪費在計算那些看不到的頂點上,進而提升性能。

3、像素優化

1)像素個數=屏幕分辨率*幀率FPS,同時受overdraw影響

2)分辨率的放縮:很多國內山寨機有過大的屏幕分辨率+糟糕的GPU,這就是畫面與性能之間的權衡關係了。有時我們要針對特定機器進行分辨率的放縮,在Unity中設置屏幕分辨率可以直接調用Screen.SetResolution()。

3)像素優化的重點在於減少overdraw,overdraw指的就是一個像素被繪製了多次。

Unity還提供了查看overdraw的視圖,在Scene視圖的Render Mode->Overdraw。當然這裏的視圖只是提供了查看物體遮擋的層數關係,並不是真正的最終屏幕繪製的overdraw。也就是說,可以理解爲它顯示的是如果沒有使用任何深度檢驗時的overdraw。這種視圖是通過把所有對象都渲染成一個透明的輪廓,通過查看透明顏色的累計程度,來判斷物體的遮擋。

4)overdraw方案:控制繪製順序。在PC上,資源無限,爲了得到最準確的渲染結果,繪製順序可能是從後往前繪製不透明物體,然後再繪製透明物體進行混合。但在移動平臺上,這種會造成大量overdraw的方式顯然是不適合的,我們應該儘量從前往後繪製。從前往後繪製之所以可以減少overdraw,都是因爲深度檢驗的功勞。在Unity中,那些Shader中被設置爲“Geometry” 隊列的對象總是從前往後繪製的,而其他固定隊列(如“Transparent”“Overla”等)的物體,則都是從後往前繪製的。這意味這,我們可以儘量把物體的隊列設置爲“Geometry” 。例如,對於天空盒子來說,它幾乎覆蓋了所有的像素,而且我們知道它永遠會在所有物體的後面,因此它的隊列可以設置爲“Geometry+1”,這樣就可以保證不會因爲它而造成overdraws。

5)overdraw方案:時刻警惕透明物體。而對於透明對象,由於它本身的特性(可以看之前關於Alpha Test和Alpha Blending的一篇文章)決定如果要得到正確的渲染效果,就必須從後往前渲染(這裏不討論使用深度的方法),而且拋棄了深度檢驗。這意味着,透明物體幾乎一定會造成overdraws。如果我們不注意這一點,在一些機器上可能會造成嚴重的性能下面。例如,對於GUI對象來說,它們大多被設置成了半透明,如果屏幕中GUI佔據的比例太多,而主攝像機又沒有進行調整而是投影整個屏幕,那麼GUI就會造成屏幕的大量overdraws。

6)overdraw方案:減少實時光照。實時光照對於移動平臺是個非常昂貴的操作,例如,一個場景裏如果包含了三個逐像素的點光源,而且使用了逐像素的shader,那麼很有可能將Draw Calls提高了三倍,同時也會增加overdraws。這是因爲,對於逐像素的光源來說,被這些光源照亮的物體要被再渲染一次。更糟糕的是,無論是靜態批處理還是動態批處理(其實文檔中只提到了對動態批處理的影響,但不知道爲什麼實驗結果對靜態批處理也沒有用),對於這種逐像素的pass都無法進行批處理,也就是說,它們會中斷批處理。

7)使用Lightmaps

它主要用於場景中整體的光照效果。這種技術主要是提前把場景中的光照信息存儲在一張光照紋理中,然後在運行時刻只需要根據紋理採樣得到光照信息即可。

        8)使用God Rays

場景中很多小型光源效果都是靠這種方法模擬的。它們一般並不是真的光源產生的,很多情況是通過透明紋理進行模擬。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章