APIs thread-safe

Sujets

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

Les singletons Global Scope sont tous thread-safe. L'accès aux serveurs à partir de threads est pris en charge (pour les serveurs VisualServer et Physics, assurez-vous que le fonctionnement threadé ou thread safe est activé dans les paramètres du projet !).

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").instance()
var enemy = enemy_scene.instance()
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.

Tableaux GDScript, dictionnaires

En GDScript, la lecture et l'écriture d'éléments provenant de plusieurs threads est possible, 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.