简介: 引擎的 PreInit 非常长,准备工作做了很多,Init 也很长,接下来就是引擎的 Tick,也就是在 while 循环里,每循环一次就调用一次,只要 while 的条件不是false,那么就会一遍一遍的调用,目前我只在 Launch.cpp 内找到了一个调用的地方, EngineTick(),其内部就一行指令 GEngineLoop.Tick(); 今天就来捋一下 GEngineLoop.Tick();看了一下我当前的这个版本内的 这个函数行数不多,只有 593 行
FEngineLoop::Tick()
起手是一个常规的性能分析统计打点宏
FLowLevelMemTracker 获取实例,并调用 UpdateStatesPerFrame 函数
BeginExitIfRequested() 兼容旧代码,判断 GShouldRequestExit 如果为 true,则把旧的 GIsRequestingExit 也设置为 true
GScopedTestExit 根据测试条件检查是否退出
FThreadHeartBeat 使用 FThreadHeartBead 的单例发送心跳
FGameThreadHitchHeartBeat 帧卡顿监控,标记当前帧开始时间
FPlatformMisc 调用热更新 tick
LatchRenderThreadConfiguration() 主线程向渲染线程插入配置
TickRenderingTickables() 调用渲染线程的更新逻辑
FMoviePlayerProxy::BlockingForceFinished() 视频播放器阻塞?,这个一行没有搞太明白,位于 LaunchEngineLoop.cpp 的 5634 行
FExternalProfiler 帧调试开启
FPlatformMisc::BeginNamedEventFrame(); 数据分析用的帧开始标记
生成当前帧数据字符串
开启 CPU 性能统计
IConsoleManager 调用控制台回调函数,负责控制台变量变动后实时响应
在 第0帧 提交一个最小规模的 LongGPUTask, 为后续的任务分片做参考基准
初始化当前帧统计的 csv 统计数据结构
FCoreDelegates 核心委托广播帧阶段开始
FlushThreadedLogs Flush 一波其它线程产生的 debug 输出
FPlatformMisc::RequestExit 检查是否达到了测试帧数上限,到了就自动退出
GEngine 设置当前 FApp 的 CurrentTime,DeltaTime
当前帧渲染线程 RHI 开启
FSceneInterface 获取所有加载了scene ,然后挨个调用 StartFrame
UE::RenderCommandPipe::StartRecording(); 渲染管线分析接口开始录制
在 RHI 之后,在 帧开始之前,如果不是 Editor,则发送动态分辨率事件
GEngine -> EmitDynamicResolutionEvent ( EDynamicResolutionStateEvent::BeginFrame );调用 GEngine 的性能监控更新,这里传的参就是上面设置过的 FApp 的 DeltaTime
重置异步加载的统计信息
GMalloc 更新内存装载的数据
FStats::AdvanceFrame 协调游戏线程与渲染线程的统计信息更新,确保性能数据的准确性与一致性
总结
捋了小 30 步,大部分都是当前帧数据清理,各种性能分析统计的打点等。不过无论是性能打点,还是渲染设置方面,渲染线程出现的频率到时大幅提升了
罗列新东西
- BeginExitIfRequested 一个兼容旧 GIsRequestingExit 代码的兼容函数,函数在 CoreGlobals.cpp 内
- **FGameThreadHitchHeartBeat ** 线程卡顿分析工具
- LatchRenderThreadConfiguration() 在帧的最开始阶段,主线程向渲染线程插入配置
- TickRenderingTickables() 掉用渲染线程的更新函数,这个函数位于 RenderingThread.cpp 内
- IConsoleManager 控制台管理器
- FSceneInterface Scene 统一管理接口