APIs thread safe

Hilos

Los hilos (threads) se utilizan para equilibrar la potencia de procesamiento entre las CPUs y los núcleos. Godot admite el multihilo, pero no en todo el motor.

Debajo se menciona una lista de los modos en que se puede usar multithreading en las distintas partes de Godot.

Ámbito Global

Los singletons de Alcance Global son seguros para hilos. Acceder a los servidores desde hilos es compatible (para VisualServer y servidores de física, asegúrate de que la operación en hilo o segura para hilos esté habilitada en la configuración del proyecto).

Esto los hace ideales para el código que crea decenas de miles de instancias en servidores y las controla desde hilos. Por supuesto, esto requiere un poco más de código, ya que se utiliza directamente y no dentro del árbol de escenas.

Árbol de escenas

Interactuar con el árbol de escenas activo NO es seguro para hilos. Asegúrate de utilizar mutexes al enviar datos entre hilos. Si deseas llamar funciones desde un hilo, puedes utilizar la función call_deferred:

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

Sin embargo, crear fragmentos de escena (nodos en una disposición de árbol) fuera del árbol activo está bien. De esta manera, se pueden construir o instanciar partes de una escena en un hilo y luego agregarlas en el hilo principal:

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

Aún así, esto solo es realmente útil si tienes un solo hilo cargando datos. Intentar cargar o crear fragmentos de escena desde varios hilos puede funcionar, pero corres el riesgo de que los recursos (que solo se cargan una vez en Godot) sean modificados por los múltiples hilos, lo que puede llevar a comportamientos inesperados o fallos.

Solo utiliza más de un hilo para generar datos de escena si realmente sabes lo que estás haciendo y estás seguro de que un solo recurso no está siendo utilizado o establecido en múltiples lugares. De lo contrario, es más seguro utilizar directamente la API de los servidores (que es completamente segura para hilos) y no modificar la escena o los recursos.

Renderización

La instancia de nodos que representan elementos en 2D o 3D (como Sprite) no es segura para hilos de forma predeterminada. Para hacer que el rendizado sea seguro para hilos, establece la configuración del proyecto Rendering > Threads > Thread Model en Multi-Threaded.

Ten en cuenta que el modelo de hilos "Multi-Threaded" tiene varios errores conocidos, por lo que puede no ser utilizable en todos los escenarios.

Arrays y diccionarios GDScript

En GDScript, leer y escribir elementos desde múltiples hilos está bien, pero cualquier cosa que cambie el tamaño del contenedor (redimensionar, agregar o eliminar elementos) requiere bloquear un mutex.

Recursos

Modificar un recurso único desde múltiples hilos no está soportado. Sin embargo, manipular referencias en múltiples hilos sí está soportado, por lo tanto, cargar recursos en un hilo también lo está. Escenas, texturas, mallas, etc., se pueden cargar y manipular en un hilo y luego agregar al escena activa en el hilo principal. La limitación aquí es, como se describió anteriormente, que debes tener cuidado de no cargar el mismo recurso desde múltiples hilos al mismo tiempo. Por lo tanto, lo más fácil es utilizar un solo hilo para cargar y modificar recursos, y luego utilizar el hilo principal para agregarlos.