引擎入口函数:Source->Runtime->Launch->private->WinMain(Windows)
循环函数:Launch.cpp->GuardedMain.
实际的游戏循环:封装在GEngineLoop中,有三个重要函数:
- FEngineLoop::PreInit()
- PreInit()存在大量初始化工作,加载各种模块代码,初始化各种底层模块。
- 在渲染的过程中,会初始化TaskGraph,线程池,RHI层以及各种shader资源
- FEngineLoop::Init()
- 构建游戏世界,创建GEngine,创建GameInstance,创建WorldContext和UWorld,构建Viewport
- FEngineLoop::Tick()
- 更新游戏逻辑
- 在渲染中,通过ENQUEUE_RENDER_COMMAND(UpdateScenePrimitives)函数调用渲染线程更新渲染数据。
- 调用RedrawViewports()函数进行上一帧的场景渲染,生成渲染命令。
- 调用FSlateApplication::Get().Tick()函数更新UI相关内容。
- 最后通过FrameEndSync.Sync函数阻塞逻辑线程直到上一帧的渲染线程执行完毕。也就是说逻辑线程和渲染线程是并行执行的,只不过它们之间相差一帧的内容。