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.

Les API sûres pour plusieurs fils d'exécution

Tâches Parallèles

Les threads sont utilisés pour équilibrer la puissance de traitement entre les processeurs et les cœurs. Godot prend en charge le multithreading, mais pas dans l'ensemble du moteur.

Vous trouverez ci-dessous une liste de façons dont le multithreading peut être utilisé dans différents domaines de Godot.

Portée globale

Global Scope singletons are all thread-safe. Accessing servers from threads is supported (for RenderingServer and Physics servers, ensure threaded or thread-safe operation is enabled in the project settings!).

Cela les rend idéales pour le code qui crée des dizaines de milliers d'instances dans les serveurs et les contrôle à partir de threads. Bien sûr, cela nécessite un peu plus de code, car celui-ci est utilisé directement et non dans l'arbre des scènes.

Scene tree (Arbre de scène)

L'interaction avec l'arbre des scènes actif n'est PAS thread safe. Veillez à utiliser des mutexes lors de l'envoi de données entre les threads. Si vous souhaitez appeler des fonctions à partir d'un thread, la fonction call_deferred peut être utilisée :

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

Cependant, il est possible de créer des morceaux de scènes (nœuds dans l'arborescence) en dehors de l'arbre actif. De cette façon, des parties d'une scène peuvent être construites ou instanciées dans un fil, puis ajoutées dans le fil principal :

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)

Pourtant, cela n'est vraiment utile que si vous avez un thread de chargement de données. Tenter de charger ou de créer des morceaux de scène à partir de plusieurs threads peut fonctionner, mais vous risquez des ressources (qui ne sont chargées qu'une seule fois dans Godot) modifiées par les plusieurs threads, entraînant des comportements inattendus ou des plantages.

N'utilisez plusieurs fils pour générer des données de scène que si vous savez vraiment ce que vous faites et que vous êtes sûr qu'une ressource n'est pas utilisée ou définie dans plusieurs. Au contraire, il sera plus sûr d'utiliser directement l'API des serveurs (qui est entièrement sécurisée) et en ne touchant pas la scènes ou les ressources.

Rendu

Instancing nodes that render anything in 2D or 3D (such as Sprite) is not thread-safe by default. To make rendering thread-safe, set the Rendering > Driver > Thread Model project setting to Multi-Threaded.

Notez que le modèle de threads multithreads comporte plusieurs bogues connus, de sorte qu'il peut ne pas être utilisable dans tous les scénarios.

Tableaux GDScript, dictionnaires

Dans GDScript, la lecture et l'écriture d'éléments à partir de plusieurs threads sont possibles, mais tout ce qui modifie la taille du conteneur (redimensionnement, ajout ou suppression d'éléments) nécessite le verrouillage d'un mutex.

Ressources

La modification d'une ressource unique à partir de plusieurs threads n'est pas prise en charge. Cependant, la gestion des références sur plusieurs threads est prise en charge, de sorte que le chargement de ressources sur un thread l'est également - les scènes, les textures, les maillages, etc - peuvent être chargés et manipulés sur un thread et ensuite ajoutés à la scène active sur le fil principal. La limitation ici est comme décrite ci-dessus, il faut faire attention à ne pas charger la même ressource à partir de plusieurs threads en même temps, il est donc plus facile d'utiliser un thread pour le chargement et la modification des ressources, puis le thread principal pour les ajouter.