UE5 在启动流程中的 EngineTick 1

简介: 引擎的 PreInit 非常长,准备工作做了很多,Init 也很长,接下来就是引擎的 Tick,也就是在 while 循环里,每循环一次就调用一次,只要 while 的条件不是false,那么就会一遍一遍的调用,目前我只在 Launch.cpp 内找到了一个调用的地方, EngineTick(),其内部就一行指令 GEngineLoop.Tick(); 今天就来捋一下 GEngineLoop.Tick();看了一下我当前的这个版本内的 这个函数行数不多,只有 593 行

FEngineLoop::Tick()

  1. 起手是一个常规的性能分析统计打点宏

  2. FLowLevelMemTracker 获取实例,并调用 UpdateStatesPerFrame 函数

  3. BeginExitIfRequested() 兼容旧代码,判断 GShouldRequestExit 如果为 true,则把旧的 GIsRequestingExit 也设置为 true

  4. GScopedTestExit 根据测试条件检查是否退出

  5. FThreadHeartBeat 使用 FThreadHeartBead 的单例发送心跳

  6. FGameThreadHitchHeartBeat 帧卡顿监控,标记当前帧开始时间

  7. FPlatformMisc 调用热更新 tick

  8. LatchRenderThreadConfiguration() 主线程向渲染线程插入配置

  9. TickRenderingTickables() 调用渲染线程的更新逻辑

  10. FMoviePlayerProxy::BlockingForceFinished() 视频播放器阻塞?,这个一行没有搞太明白,位于 LaunchEngineLoop.cpp 的 5634 行

  11. FExternalProfiler 帧调试开启

  12. FPlatformMisc::BeginNamedEventFrame(); 数据分析用的帧开始标记

  13. 生成当前帧数据字符串

  14. 开启 CPU 性能统计

  15. IConsoleManager 调用控制台回调函数,负责控制台变量变动后实时响应

  16. 在 第0帧 提交一个最小规模的 LongGPUTask, 为后续的任务分片做参考基准

  17. 初始化当前帧统计的 csv 统计数据结构

  18. FCoreDelegates 核心委托广播帧阶段开始

  19. FlushThreadedLogs Flush 一波其它线程产生的 debug 输出

  20. FPlatformMisc::RequestExit 检查是否达到了测试帧数上限,到了就自动退出

  21. GEngine 设置当前 FApp 的 CurrentTimeDeltaTime

  22. 当前帧渲染线程 RHI 开启

  23. FSceneInterface 获取所有加载了scene ,然后挨个调用 StartFrame

  24. UE::RenderCommandPipe::StartRecording(); 渲染管线分析接口开始录制

  25. 在 RHI 之后,在 帧开始之前,如果不是 Editor,则发送动态分辨率事件
    GEngine -> EmitDynamicResolutionEvent ( EDynamicResolutionStateEvent::BeginFrame );

  26. 调用 GEngine 的性能监控更新,这里传的参就是上面设置过的 FApp 的 DeltaTime

  27. 重置异步加载的统计信息

  28. GMalloc 更新内存装载的数据

  29. FStats::AdvanceFrame 协调游戏线程与渲染线程的统计信息更新,确保性能数据的准确性与一致性

总结

捋了小 30 步,大部分都是当前帧数据清理,各种性能分析统计的打点等。不过无论是性能打点,还是渲染设置方面,渲染线程出现的频率到时大幅提升了
罗列新东西

  • BeginExitIfRequested 一个兼容旧 GIsRequestingExit 代码的兼容函数,函数在 CoreGlobals.cpp 内
  • **FGameThreadHitchHeartBeat ** 线程卡顿分析工具
  • LatchRenderThreadConfiguration() 在帧的最开始阶段,主线程向渲染线程插入配置
  • TickRenderingTickables() 掉用渲染线程的更新函数,这个函数位于 RenderingThread.cpp
  • IConsoleManager 控制台管理器
  • FSceneInterface Scene 统一管理接口
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容