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.

執行緒安全的 API

執行緒

執行緒是用來平衡各CPU和核心的處理能力.Godot支援多執行緒, 但不是在整個引擎中.

下面是可以在Godot的不同區域使用多執行緒的方法列表.

全域作用域

Global Scope 單例都是執行緒安全的. 支援從執行緒存取伺服器(對於VisualServer和物理伺服器, 確保在專案設定中啟用執行緒或執行緒安全操作!).

這使它們成為在伺服器中建立數十萬個實例並從執行緒控制它們的程式碼的理想選擇. 當然, 還需要更多的程式碼, 因為這是直接使用的而不是嵌入場景樹中使用.

場景樹

與活動場景樹的互動是執行緒 安全的. 當在執行緒之間發送資料時, 請確保使用mutexes. 如果你想從一個執行緒呼叫函式, 可以使用 call_deferred 函式:

# Unsafe:
node.add_child(child_node)
# Safe:
node.call_deferred("add_child", child_node)

但是, 可以在啟動的場景樹外建立場景塊(以樹形式排列的節點). 這樣, 可以在執行緒中建構或產生實體部分場景, 然後將其新增到主執行緒中:

var enemy_scene = load("res://enemy_scene.scn")
var enemy = enemy_scene.instantiate()
enemy.add_child(weapon) # Set a weapon.
world.call_deferred("add_child", enemy)

不過, 只有當您有 一個 執行緒載入資料時, 這才真正有用. 從多個執行緒載入或建立場景塊可能有效, 但你要冒著資源被多執行緒調整的風險(在Godot中只載入一次), 從而導致意外行為或當機.

只有當您 "真正" 知道自己在做什麼, 並且確信一個資源沒有被多個資源使用或設定時, 才可以使用多個執行緒來生成場景資料. 否則, 直接使用服務端的API(它是完全執行緒安全的)而不接觸場景或資源會更安全.

渲染

預設情況下,產生實體能夠渲染 2D 或 3D 內容的節點(比如 Sprite)是執行緒*不*安全的。要讓渲染做到執行緒安全,請將專案設定中的 Rendering > Threads > Thread Model 設為 Multi-Threaded

請注意,Multi-Thtreaded 執行緒模型有若干已知的問題,所以無法勝任所有場景。

GDScript 陣列、字典

在 GDScript 中,可以從多個執行緒讀取和寫入元素,但是任何改變容器大小的操作(調整大小、新增或刪除元素)都需要鎖定互斥鎖。

資源

不支援從多個執行緒修改一個唯一的資源. 但是支援處理多個執行緒上的引用, 因此在一個執行緒上載入資源也是如此, 場景, 紋理, 網格等都可以在一個執行緒上載入和操作, 然後新增到主執行緒的活動場景中. 這裡的限制如上所述, 必須注意不要同時從多個執行緒上載入相同的資源, 因此最簡單的方法是用 一個 執行緒來載入和修改資源, 然後用主執行緒來新增資源.