Work in progress

The content of this page was not yet updated for Godot 4.2 and may be outdated. If you know how to improve this page or you can confirm that it's up to date, feel free to open a pull request.

使用 MultiMesh 進行優化

對於大量的實例(成千上萬), 需要不斷處理(需要保留一定的控制), 建議優化 直接使用服務 .

當物件數量達到數十萬或數百萬時, 這些方法都不再有效. 儘管如此, 根據要求, 還有另一種可能的優化方法.

Meshes - 網格

MultiMesh 是一個單次繪製的像素,可以一次性繪製多達數百萬個物件。它的效率非常高,因為它使用 GPU 硬體來做這件事(不過在 OpenGL ES 2.0 中,它的效率較低,因為沒有硬體支援)。

唯一的缺點是, 對於單個實例, 不可能進行 螢幕視錐 剔除. 這意味著, 根據整個MultiMesh的可見性, 數百萬個物件將被 始終不會 繪製. 可以為它們提供一個自訂的可見性矩形, 但它將始終是 全或無 的可見性.

如果物件足夠簡單(只有幾個頂點), 這通常不是什麼大問題, 因為大多數現代GPU都為這種用例進行了優化. 一個變通的方法是為世界的不同區域建立多個MultiMeshes.

也可以在頂點著色器中執行一些邏輯(使用 INSTANCE_IDINSTANCE_CUSTOM 內建常數). 關於在MultiMesh中對數千個物件進行動畫製作的例子, 請參見 Animating thousands of fish 教學. 可以通過紋理向著色器提供資訊(有浮點 Image 格式是理想的格式).

另一種選擇是使用GDNative和C++, 效率應該非常高(可以通過 VisualServer.multimesh_set_as_bulk_array() 函式來設定所有物件使用線性記憶體的全部狀態). 這樣一來, 可以用多個執行緒建立陣列, 然後在一次呼叫中設定, 提供了很高的快取效率.

最後, 並不是所有的MultiMesh實例都必須是可見的. 可以通過 MultiMesh.visible_instance_count 屬性來控制可見的數量. 典型的工作流程是先分配最大數量的實例, 然後根據目前需要的數量改變可見的數量.

計時器範例

這裡是一個從程式碼中使用MultiMesh的例子.GDScript以外的其他語言對於數百萬個物件來說可能更有效, 但對於幾千個物件來說,GDScript應該是可以的.

extends MultiMeshInstance3D


func _ready():
    # Create the multimesh.
    multimesh = MultiMesh.new()
    # Set the format first.
    multimesh.transform_format = MultiMesh.TRANSFORM_3D
    # Then resize (otherwise, changing the format is not allowed).
    multimesh.instance_count = 10000
    # Maybe not all of them should be visible at first.
    multimesh.visible_instance_count = 1000

    # Set the transform of the instances.
    for i in multimesh.visible_instance_count:
        multimesh.set_instance_transform(i, Transform3D(Basis(), Vector3(i * 20, 0, 0)))