根據不同平台調整Static mesh的LOD


通常開發跨平台遊戲的時候,會想要針對Static Mesh做LOD區隔。
而UE4提供好用的Minimal LOD功能,讓開發者不用特別寫程式碼,就可以根據不同平台調整LOD參數。Minimal LOD的參數是可以每個static mesh設定的,設定的地方可以在Static Mesh的編輯器內找到。如圖所示



例如說Windows的Minimal LOD設為0,Android跟iOS設為1。
這樣的話在實際執行的時候,Android跟iOS平台只會看到1以後的LOD mesh,可以有效的控制場景總面數。

還有另一個參數r.StaticMeshLODDistanceScale可以控制LOD切換的距離。
數字越大代表會越早切換到低階層的LOD。
這個參數也可以針對平台做設定,不過是影響全域的變數,所以要在Device Profile的頁面設定。記得要Save as Default才會存檔。




舉例來說
r.StaticMeshLODDistanceScale=2.0
然後LOD1的screen size設為0.3的話
代表在這個平台0.3*2的距離就會切換成LOD1了。

不過使用LODDistanceScale有個小缺點,就是在編輯的時候預設都是使用r.StaticMeshLODDistanceScale=1.0。要把場景調整到1.0跟2.0外觀看起來不錯的狀態,是需要很多人工檢查的。

上面提到的兩個參數可以控制Minimal LOD,不過這兩個參數都是執行的時候,告訴系統該顯示哪一層LOD。
在打包的過程還是都會把全部的LOD都包進去,影響最後打包的容量。

如果想要避免比Minimal LOD更精細的LOD也被打包進平台內。我們需要在打包的平台把Device Profile參數
r.StaticMesh.StripMinLodDataDuringCooking設為1。

或是使用文字編輯器打開
[Project Path]/Config/DefaultDeviceProfiles.ini

把以下區段
[Windows DeviceProfile]
DeviceType=Windows
BaseProfileName=
改為
[Windows DeviceProfile]
DeviceType=Windows
BaseProfileName=
+CVars=r.StaticMesh.StripMinLodDataDuringCooking=1

這樣,如果Android跟iOS設為1的話,這兩個平台在打包的時候就會避免把LOD0做輸出。
可以有效的減少低規格平台的資料量。

要注意打包的平台指是你的打包那台機器所屬的平台,
而不是你的目標平台,
通常會是Windows,MacOS,或是Linux。


實作程式碼在
FStaticMeshLODResources::GenerateClassStripFlags
FStaticMeshLODResources::IsLODCookedOut
可以參考看看。

留言

這個網誌中的熱門文章

UE4 除錯技巧分享 (一)

UE4 GameplayAbilitySystem - GameplayEffect & GameplayCue 如何設定參數

UE4 除錯技巧分享 (二)