Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

優化 3D 性能

編譯

Godot會自動執行視圖視錐剔除, 以防止渲染視口外的物體. 這對於發生在小範圍內的遊戲來說效果很好, 然而在較大的關卡中, 事情很快就會變得很麻煩.

遮擋剔除

比如走在一個小鎮上, 你可能只能看到你所在的街道上的幾棟建築, 以及天空和幾隻飛過頭頂的鳥. 然而就一個天真的渲染器而言, 你仍然可以看到整個小鎮. 它不會只渲染你前面的建築, 它會渲染那後面的街道, 與那條街上的人, 那後面的建築. 你很快就會遇到這樣的情況: 你試圖渲染比可見的東西多10倍或100倍的東西.

事情並沒有看上去那麼糟糕,因為 Z 緩衝通常只允許 GPU 完全遮擋在前面的物體。這被稱為*深度預處理*(depth prepass),在使用 GLES3 渲染器時,Godot 預設啟用。然而,不需要的物件仍然在降低性能。

我們可以減少渲染量的一種方法是**利用遮蔽**。 Godot 4.0 及更高版本提供了一種使用遮擋器節點進行遮蔽剔除的新方法。有關在場景中設定遮蔽剔除的說明,請參閱 doc_occlusion_culling`。

備註

在某些情況下,你可以通過調整你的關卡設計來增加更多的遮擋機會。例如,你可以增加更多的牆來防止玩家看得太遠,否則就會因為失去了遮擋機會而降低性能。

透明物體

Godot通過 MaterialShader 對對象進行排序以提高性能. 然而, 這對透明物體來說是不可能的. 透明物體從後往前渲染, 以便與後面的物體混合. 因此, 儘量少使用透明物件 . 如果一個物體有一小部分是透明的, 儘量讓這部分成為一個獨立的表面, 有自己的材質.

更多資訊請參考 C# API 與 GDScript 的不同 一頁。

細節程度(LOD)

在某些情況下, 特別是在遠處, 用簡單的版本**代替複雜的幾何圖形可能是個好主意. 最終使用者可能看不出什麼區別. 考慮看看遠處的大量樹木. 有幾種策略可以替換不同距離的模型. 您可以使用較低的多邊形模型, 或者使用透明度來模擬更複雜的幾何體.

Godot 4 提供了多種控制細節等級的方法:

  • 使用 doc_mesh_lod 進行網格匯入的自動方法。

  • 使用 doc_visibility_ranges 在 3D 節點中配置的手動方法。

  • 貼紙 <doc_using_decals>` 和燈光 <doc_lights_and_shadows>` 也可以使用各自的 距離淡入淡出 屬性從細節等級中受益。

雖然它們可以單獨使用,但一起使用時這些方法最有效。例如,您可以設定可見範圍來隱藏距離玩家太遠而無法注意到的粒子效果。同時,您可以依靠網格 LOD 來使粒子效果的網格在遠處渲染時細節較少。

可見範圍也是為遠處幾何體設定「冒充者」的好方法(見下文)。

Billboard 和 imposter

使用透明度來處理LOD的最簡單版本是看板. 例如, 你可以用一個單一的透明四邊形來表示一棵樹的距離. 這可以是非常便宜的渲染, 當然, 除非前面有很多樹. 在這種情況下, 透明度可能會開始吞噬填充率(關於填充率的更多資訊, 請參見 最佳化).

另一種方法是不只渲染一棵樹, 而是將一些樹作為一組來渲染. 如果你能看到一個區域, 但在遊戲中不能實際接近它, 這可能是特別有效的.

你可以通過預先渲染物件的不同角度的視圖來製作冒牌貨. 或者你甚至可以更進一步, 週期性地將一個物體的視圖重新渲染到一個紋理上, 作為一個冒牌貨使用. 在遠處, 你需要將觀察者移動相當長的距離, 視角才會發生顯著變化. 這可能是複雜的工作, 但可能是值得的, 這取決於你正在製作的專案型別.

使用產生實體(MultiMesh)

如果必須在同一地點或附近繪製多個相同的物件, 請嘗試使用 MultiMesh 來代替.MultiMesh允許以很小的性能代價來繪製成千上萬的對象, 這使得它非常適合用於繪製羊群, 草地, 粒子以及其他任何有成千上萬相同物件的地方.

另請參閱 Using MultiMesh 文件.

烘焙照明

對物體進行照明是最昂貴的渲染操作之一. 即時光照, 陰影(尤其是很多燈光)和 GI 都特別昂貴. 對於低功率的移動裝置來說, 它們可能根本無法處理.

考慮使用烘焙照明 , 尤其是移動端, 這看起來很棒, 但有一個缺點, 那就是它不是動態的, 有時, 這需要做出的權衡.

有關使用烘焙光照貼圖的說明,請參閱 doc_using_lightmap_gi。為了獲得最佳性能,您應該將燈光的烘焙模式設定為**靜態**,而不是預設的**動態**,因為這將跳過具有烘焙光照的網格體上的即時光照。

使用**靜態**烘焙模式的燈光的缺點是它們無法將陰影投射到具有烘焙光照的網格上。這可以使具有室外環境和動態物件的場景看起來平坦。效能和品質之間的良好平衡是為 class_DirectionalLight3D 節點保持**動態**,並為大多數(如果不是全部)全向燈和聚光燈使用**靜態**。

Animation - 動畫選項

在某些平臺上, 動畫和頂點動畫(如換膚和變形)可能非常昂貴. 你可能需要大大降低動畫模型的多邊形數量, 或者任何時候限制螢幕上的模型數量.

class_VisibleOnScreenEnabler3D 和 class_VisibleOnScreenNotifier3D 節點可用於此目的。

龐大的世界

如果您要製作大型遊戲, 則與小型遊戲可能會有所不同.

大型的世界可能需要用碎片建立, 可以在你在世界中移動時按需載入, 這可以防止記憶體使用失控, 也可以將所需的處理限制在局部區域.

在大型世界中, 由於浮點錯誤, 也可能會出現渲染和物理故障, 你可能會使用一些技術, 比如將世界圍繞著玩家的方向(而不是相反), 或者定期移動原點以保持以 Vector3(0, 0, 0) 為中心.