- Home /
What's the best way to structure a recursive long running algorithm?
I have built recursive path finding algorithm, it seems fairly quick but it also blocks the main update loop while it's running. I was thinking to move it to a set of recursively called co-routines or another thread but I'm unsure which would be best - I'd like to be able to call it fairly regularly without worrying about the impact on the game.
The current structure of my code is basically the following, with the path-finding code removed (as it's not really the point of my question), just outlining the amount of recursion it has - so I was considering if I should split the method calls to co-routines?
void Update() {
....
DefineRoutes(this.transform.position, Target);
....
}
void DefineRoutes(Vector3 CurrentPosition, GameObject TargetObject)
{
......
PlotRoute(this.transform.position, Target, 0);
......
}
void PlotRoute(Vector3 CurrentPosition, GameObject TargetObject, int RouteNumber)
{
.....
NextPoint(CurrentPosition, TargetObject);
.....
}
RoutePoint NextPoint (Vector3 StartingPoint, GameObject TargetObject)
{
......
TestRoutePoint(StartingPoint, rotated, TargetObject);
......
}
PossibleRoutePoints TestRoutePoint(Vector3 StartingPoint, Vector3 heading, GameObject TargetObject)
{
......
return;
......
}
Answer by IgorAherne · Feb 19, 2017 at 09:05 AM
1) make it a stack recursion, with for-loop and stack datastructure
https://youtu.be/TwZH-aoSzJk?t=5h56m39s
2) thread it out, but you then shouldn't use any unity classes (also means no transforms or gameObjects), you can only use structs.
A second thread will give you significantly better performance than coroutines
Thanks - there's a lot to go through in this answer :-)
Could I just ask though, in the separate thread, why should I only use Structs and not Unity Classes? Are Lists etc. still O$$anonymous$$?
Unity API is not multithreading safe, but lists are not unity's, they come from system.stuff
Your answer
Follow this Question
Related Questions
Multi threading problem ! 2 Answers
Does UnityEngine.CustomeYieldInstruction works in a seperate thread? 2 Answers
Return value from coroutine to non monobehaviour 1 Answer
How to make a function wait untill a specific bool is true? 2 Answers
Making calls to Spotify REST API blocks main thread 2 Answers