5-22 Terrain Performance Optimization And Area Light
今天想再來跟大家分享Terrain的優化,Terrain在行動平台上真的頗佔效能,尤其是 Tree、Grass這些東西,雖然建立場景的時候方便很多,但方便性帶來的犧牲就是Draw Call超高。
其中一個建議是Terrain只用來建立地形,諸如山脈、峽谷、平原這些高低起伏的地形,如果要放樹的話不要使用Terrain的Tree Tool,直接放3D模型上去。草的話更佔效能,所以就請大家斟酌使用。
我想應該還是有人希望用Terrain,真的方便很多,所以另一個建議是可以使用我接下來介紹的一些參數設定,多少對降低Draw Call有點幫助。
如果有人不太清楚Draw Call是什麼的話,可以先參考以前的文章唷!
5-1 Optimization In Mobile Platform
場景模樣如下,Batches為720,SetPass calls為452。
接著我將Detail Resolution Per Patch設定為128(似乎最高為128)。
結果Batches降到536,SetPass calls降到351,大家可以看到場景中的草地跟樹叢沒有什麼明顯的變化,但效能改善很多。
但是實際呈現的光照效果非常糟糕!
這種光線的缺點是無法進行Realtime的模擬,必須要Bake以後才看得見效果,如下我設定的Width跟Height還有Color。
然後放置方式如下圖,最後的Bake結果就會跟SpotLight差不多。如果Bake的時間要很久,我的做法是將這個場景複製另外一份,然後把其他無關的地方都刪掉,只保留要測試的區塊,如此進行Area Light的設定會快很多。
其中一個建議是Terrain只用來建立地形,諸如山脈、峽谷、平原這些高低起伏的地形,如果要放樹的話不要使用Terrain的Tree Tool,直接放3D模型上去。草的話更佔效能,所以就請大家斟酌使用。
我想應該還是有人希望用Terrain,真的方便很多,所以另一個建議是可以使用我接下來介紹的一些參數設定,多少對降低Draw Call有點幫助。
如果有人不太清楚Draw Call是什麼的話,可以先參考以前的文章唷!
5-1 Optimization In Mobile Platform
好的!接下來先針對Grass進行優化。首先請點選自己場景的Terrain,然後按下設定按鈕中,會看見其中有Resolution的設定,然後來看看Detail Resolution跟Detail Resolution Per Patch這兩個數值。
根據官方API文件說明:
Detail Resolution | Resolution of the map that determines the separate patches of details/grass. Higher resolution gives smaller and more detailed patches. |
Detail Resolution Per Patch | Length/width of the square of patches renderered with a single draw call. |
所以,Detail Resolution的數值越高,繪製在地圖上的細節會越精細。不過要注意!調低數值會導致原本設置的草消失,再調高也變不回來唷!所以建議不要隨意調整這個設定值。
Detail Resolution Per Patch是指Batches的時候,需要繪製多少個區塊的草地。根據網路上查到的資料,這些草地資料是存在陣列中,該數值則決定每次Draw Call需要處理多大範圍的陣列。假設地圖的解析度是512x512,Detail Resolution Per Patch設定為8,則Draw Call次數為(512x512) / (8x8) = 4096。若數值設定為128,則為(512x512) / (128x128) = 16。
接下來就讓我們實際調整看看吧,首先原本的Detail Resolution Per Patch設定為8。
場景模樣如下,Batches為720,SetPass calls為452。
接著我將Detail Resolution Per Patch設定為128(似乎最高為128)。
結果Batches降到536,SetPass calls降到351,大家可以看到場景中的草地跟樹叢沒有什麼明顯的變化,但效能改善很多。
接著來調整Base Terrain設定中的Pixel Error,Base Map Dist.跟Cast Shadows。
Pixel Error的預設值通常為5,基本上就是地形的 LOD 設定,設定值越高地形呈現的三角形區塊也會越明顯。如下圖沙漠場景中,有一些邊邊角角的樣子呈現的比較流線、滑潤。
當我將Pixel Error調整到200後,大家可以看到原本滑潤的邊角變成突兀的三角形了,相對來說效能會好一些,但視覺上會有影響,請自己調整到一個可以接受的程度吧。
Base Map Dist為設定顯示高解析紋理的距離,預設值為1000 公尺,當地形超過設定距離的部份,只會顯示低解析的紋理。如下圖為預設值1000的情況。
接著我調整數值為5公尺,結果如下圖圈起來的部分變成低解析紋理了。這個數值也是要合理設定,比方說我的遊戲是固定攝影機方向的遊戲,所以比較遙遠的場景就可能看不見,大概設定為50公尺是沒有問題的。但如果你的遊戲要做成開放世界,又是大草原一望無際的景象,那這個數值可能就不能太低嘍。
Cast Shadows為設定地形的投射陰影效果,如果說太陽光射向一座山,則山的另外一邊應該要有很大片的陰影,地形越複雜的時候影響效能才會比較明顯。如下圖展示有使用Cast Shadows時的情況。
下圖為關閉Cast Shadows的情況,由於這邊關閉的影子僅針對地形,所以房屋跟玩家角色造成的陰影還是保留著的,而且地形中應該呈現比較深的紋理部分也仍舊保留,相較之下我反而覺得這個場景比較適合將Cast Shadows關閉,效果更好,也能提高效能。
所以,我的Base Terrain設定如下。
太神奇了!僅僅調整Terrain的設定,Batches就降到226,SetPass calls降到187。果然Terrain就是效能的敵人啊!如果使用Unity的預設值,對行動平台來說負擔太大了。
再來比較調整之前的畫面,細節上並沒有差很多呢!
最後對光照的優化,我在之前的文章中介紹過Lightmapping。
5-4 Lightmapping
當我將Pixel Error調整到200後,大家可以看到原本滑潤的邊角變成突兀的三角形了,相對來說效能會好一些,但視覺上會有影響,請自己調整到一個可以接受的程度吧。
Base Map Dist為設定顯示高解析紋理的距離,預設值為1000 公尺,當地形超過設定距離的部份,只會顯示低解析的紋理。如下圖為預設值1000的情況。
接著我調整數值為5公尺,結果如下圖圈起來的部分變成低解析紋理了。這個數值也是要合理設定,比方說我的遊戲是固定攝影機方向的遊戲,所以比較遙遠的場景就可能看不見,大概設定為50公尺是沒有問題的。但如果你的遊戲要做成開放世界,又是大草原一望無際的景象,那這個數值可能就不能太低嘍。
Cast Shadows為設定地形的投射陰影效果,如果說太陽光射向一座山,則山的另外一邊應該要有很大片的陰影,地形越複雜的時候影響效能才會比較明顯。如下圖展示有使用Cast Shadows時的情況。
下圖為關閉Cast Shadows的情況,由於這邊關閉的影子僅針對地形,所以房屋跟玩家角色造成的陰影還是保留著的,而且地形中應該呈現比較深的紋理部分也仍舊保留,相較之下我反而覺得這個場景比較適合將Cast Shadows關閉,效果更好,也能提高效能。
所以,我的Base Terrain設定如下。
太神奇了!僅僅調整Terrain的設定,Batches就降到226,SetPass calls降到187。果然Terrain就是效能的敵人啊!如果使用Unity的預設值,對行動平台來說負擔太大了。
再來比較調整之前的畫面,細節上並沒有差很多呢!
最後對光照的優化,我在之前的文章中介紹過Lightmapping。
5-4 Lightmapping
當時我的作法是使用SpotLight,並將Mode調整為Baked。
但是實際呈現的光照效果非常糟糕!
在Realtime的時候是長這樣的。
後來我發現應該要使用Area Light才行,對場景按右鍵,選擇Light/Area Light。
這種光線的缺點是無法進行Realtime的模擬,必須要Bake以後才看得見效果,如下我設定的Width跟Height還有Color。
然後放置方式如下圖,最後的Bake結果就會跟SpotLight差不多。如果Bake的時間要很久,我的做法是將這個場景複製另外一份,然後把其他無關的地方都刪掉,只保留要測試的區塊,如此進行Area Light的設定會快很多。
最後Bake完成的效果和原本Spotlight的差不多,Batches為252,SetPass calls為219。
留言
張貼留言