在GameThread线程之外的其他线程中,不允许做一下事情
1. 不要 spawning / modifying / deleting UObjects / AActors
2. 不要使用定时器 TimerManager
3. 不要使用任何绘制接口,例如 DrawDebugLine
4. 如果想在主线程中异步处理(也就是分帧处理),可以使用一下接口(在 Async.h 中)
AsyncTask(ENamedThreads::GameThread, [&]() {
UE_LOG(LogMyTest, Warning, TEXT("--- UMyGameInstance::MyAsyncTask"));
SpawnActor(3);
});
线程唤醒、悬挂
1. FEvent* ThreadSuspendedEvent;
2. 线程悬挂。A线程中调用 ThreadSuspendedEvent->Wait();,A线程就会悬挂主,必须由B线程调用 ThreadSuspendedEvent->Trigger(); 才能唤醒A线程。
3. 所以如果直接在主线程(GameThread)中调用 ThreadSuspendedEvent->Wait();,那就看起像卡死了。
编辑器模式下进行多线程开发注意事项
1. PIE模式下,与新开的线程交互正常;如果退出PIE模式,PIE中的实例对象都会被标记为坐等回收的对象 InValid,此时如果新开的线程还在Run中跑用到PIE中的实例对象,将造成 编辑器崩溃。
2. 最好在你的游戏退出时 FPrimeNumberWorker ShutDown一下,方便下次测试。
void UMyGameInstance::Shutdown()
{
FPrimeNumberWorker::Shutdown();
Super::Shutdown();
}