+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 (56 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 1 day ago 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.