+1 vote

Hello there! I'm making new threads to improve performance and load some terrain in the background. I was testing out threads when I found the following problem:

I have this function in World:

func test_threads():
    var newchunk=MeshInstance.new()
    newchunk.set_script(load("res://chunk.gd"))
    var mythread=Thread.new()
    var err
    err=mythread.start(newchunk,"test_threads","butt")#Need to pass user data
    var a=mythread.wait_to_finish()

Then this function in chunk.gd:

func test_threads(userdata):
    print("chunk.test_threads got run")
    var mesh=Mesh.new()
    return userdata

And this crashes! Some other cases:
Remove var mesh=Mesh.new() -> it runs fine
Change to var mesh=MeshInstance.new() -> It crashes
Change to var mesh=Resource.new() -> It runs fine

So do we know of this problem? Can anyone else make a mesh from a new thread?

asked Jul 25, 2017 in Engine by DrPlamsa (58 points)
edited Jul 26, 2017 by volzhs

1 Answer

0 votes

https://docs.godotengine.org/de/latest/tutorials/threads/thread_safe_apis.html

Modifying a unique resource from multiple threads is not supported, but loading them on threads or handling a reference is perfectly supported. Scenes, textures, meshes, etc. Can be loaded and manipulated on threads, then added to the active scene in the main thread.

What I do to work around this is generate the vertex data I need on a thread, then on the main thread when complete, generate the mesh with the vertex data.
Not ideal, but that is as close as you can get for now.

answered Mar 21 by supagu (48 points)
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.