[4.7.6] Why does World->OverlapMulti causes a hang in my FRunnable?

I made a subclass of FRunnable to handle AI calculations.
Im not familiar with Multi Threading, so I was just setting up some tests at first.

I put in a World->OverlapMulti function to get a list of Actors around the AIPawn.
Im using the following setup in Run to call it:

//Run
uint32 ADMAIThreadManager::Run()
{
	//Initial wait before starting
	FPlatformProcess::Sleep(0.03);
 
	//While not told to stop this thread 
	//		and not yet finished 
	while (StopTaskCounter.GetValue() == 0 && !IsFinished())
	{
		if (AIData->GetData()[0].CycleCounter == 1)
		{
			if (IsIntEven(RunCycleCounter))														//every other cycle count
			{
				APawn* TempPawn = AIData->GetData()[0].AIPawn;
				if (TempPawn)
				{
					TArray<struct FOverlapResult> Overlaps;
					TArray<AActor*> IgnorePawns;
					IgnorePawns.Add(TempPawn);
					Overlaps = OverlapSphereOnPoint(TempPawn->GetActorLocation(), 10000, IgnorePawns);
					AIData->GetData()[0].TargetList.Empty();
					for (size_t i = 0; i < Overlaps.Num(); i++)
					{
						//TODO: add Team recognition
						if (Overlaps[i].GetActor()) AIData->GetData()[0].TargetList.Add(Overlaps[i].GetActor());
					}
				}
			}
			RunCycleCounter++;
			if (RunCycleCounter > 32) RunCycleCounter = 0;
			AIData->GetData()[0].CycleCounter = 0;
		}
	}
 	return 0;
}

AIData->GetData()[0].CycleCounter is set to 1 in a Timer in the controller, to ensure that the OverlapSphereOnPoint function(that handles the actual World->OverlapMulti call) isn’t called too often.

My cycling code works, and OverlapSphereOnPoint is only called every other second.

But when it does the game hangs.

When testing with “Play in Editor” the hang is excessive, halting the game for several seconds.
If I build the project and test outside of the editor the hang is much less(< a second but still noticeable).

The whole reason I want to multi thread the AI is so it doesn’t lag out the other aspects of the game.
And the weird thing is that if I just put that code into the AI Controller, there wouldn’t be any hang at all.
(I already have other actors with similar and much more frequent uses of World->OverlapMulti that don’t produce any lag…)

Is it because Im trying to call World->OverlapMulti from a different thread?

If so, how am I suppose to achieve these kinds of searches from another thread?

You can’t do calls into the UObject system on other threads. You can only do gameplay from the Game thread.

k.
The whole point of this idea was to move AI off of the Game Thread to prevent lag/slow down that could result from lots of AI opponents running at the same time during gameplay.

If I can’t move the overlap checks and traces (AFAIK, pretty much the only things expensive enough to be worth moving) whats the point?
How am I suppose to manage my AI without crippling the game thread?

Am I just thinking about this wrong?

You can use async traces and overlaps. The results come back one or more frames later. Async line trace docs

Thank you. Ill explore those.

The link is broken, could you update please?
Or the API was removed?