首页 > 编程语言 >UE4 源码解析----引擎初始化流程

UE4 源码解析----引擎初始化流程

时间:2023-05-30 17:47:13浏览次数:67  
标签:初始化 Tick 函数 渲染 ---- 源码 线程 UE4 引擎

   在研究UE4的源码过程中着实不理解的地方有很多,今天给大家分享一下UE4引擎的初始化流程。

一、引擎的函数入口

C++的函数入口都是Main() 函数入口,UE4也是一样,Engine\Source\Runtime\Launch\Private

Windows函数入口

 引擎入口函数为:GuardedMain

 二、引擎初始化的三个阶段

UE4所有相关的代码都在游戏循环函数中,在Launch.cpp中,写了四个函数PreInit(),Init(),以及Tick(),实际的函数现是在GEngineLoop中FEngineLoop::PreInit(),FEngineLoop::Init(),以及FEngineLoop::Tick()。引擎先执行预初始化工作,在执行初始化工作,在执行Tick()函数,初始化一些渲染UI游戏逻辑等内容。

  1. int32 EnginePreInit( const TCHAR* CmdLine )
  2. {
  3. int32 ErrorLevel = GEngineLoop.PreInit( CmdLine );
  4. return( ErrorLevel );
  5. }
  6. /**
  7. * Inits the engine loop
  8. */
  9. int32 EngineInit()
  10. {
  11. int32 ErrorLevel = GEngineLoop.Init();
  12. return( ErrorLevel );
  13. }
  14. /**
  15. * Ticks the engine loop
  16. */
  17. void EngineTick( void )
  18. {
  19. GEngineLoop.Tick();
  20. }
  21. void EngineExit( void )
  22. {
  23. // Make sure this is set
  24. RequestEngineExit(TEXT("EngineExit() was called"));
  25. GEngineLoop.Exit();
  26. }

引擎初始化过程 

  1. #if WITH_EDITOR
  2. if (GIsEditor)
  3. {
  4. ErrorLevel = EditorInit(GEngineLoop);
  5. }
  6. else
  7. #endif
  8. {
  9. ErrorLevel = EngineInit();
  10. }
  11. }
  12. double EngineInitializationTime = FPlatformTime::Seconds() - GStartTime;
  13. UE_LOG(LogLoad, Log, TEXT("(Engine Initialization) Total time: %.2f seconds"), EngineInitializationTime);
  14. #if WITH_EDITOR
  15. UE_LOG(LogLoad, Log, TEXT("(Engine Initialization) Total Blueprint compile time: %.2f seconds"), BlueprintCompileAndLoadTimerData.GetTime());
  16. #endif
  17. ACCUM_LOADTIME(TEXT("EngineInitialization"), EngineInitializationTime);
  18. BootTimingPoint("Tick loop starting");
  19. DumpBootTiming();
  20. while( !IsEngineExitRequested() )
  21. {
  22. EngineTick();
  23. }

 三、FEngineLoop::PreInit()函数

PreInit有着大量的初始化工作:日志功能的启动,线程池的启动,加载了预初始相关的模块,应用程序层面的初始化(ini配置的缓冲的加载,TaskGraph的启动),RHI初始化,异步IO系统初始化,平台特征模块初始化,游戏物理的初始化,流管理初始化,Slate应用程序的创建,启动渲染线程,加载启动模块。

 四、FEngineLoop::Init()函数

引擎的对象的构造,引擎的命令行控制字处理,时间初始化,引擎的具体初始化。它先会创建GEngine,然后创建GameInstance,然后创建WorldContext及UWorld,最后会创建游戏使用的viewport。

 五、FEngineLoop::Tick()函数

开始帧(请求渲染线程的BeginFrame命令、更新时间以及处理最大更新率、更新FPS图表),重启延迟更新(请求渲染线程的ResetDeferredUpdates、消息泵,引擎的具体循环、Shader的异步编译处理),结束帧(请求渲染线程的EndFrame命令)

逻辑线程先通过ENQUEUE_RENDER_COMMAND(UpdateScenePrimitives)函数调用渲染线程更新渲染数据。

然后通过GEngine->Tick()更新游戏逻辑,其中也会更新物理相关的内容。

然后调用RedrawViewports()函数进行上一帧的场景渲染,生成渲染命令。

然后调用FSlateApplication::Get().Tick()函数更新UI相关内容。

最后通过FrameEndSync.Sync函数阻塞逻辑线程直到上一帧的渲染线程执行完毕。也就是说逻辑线程和渲染线程是并行执行的,只不过它们之间相差一帧的内容。

标签:初始化,Tick,函数,渲染,----,源码,线程,UE4,引擎
From: https://www.cnblogs.com/tomato-haha/p/17443892.html

相关文章

  • Hibernate使用实例
    示例1:创建实体类和映射importjavax.persistence.*;@Entity@Table(name="students")publicclassStudent{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;@Column(name="name")privateStringname......
  • nuscene 数据集
    nuscenes数据集官网:https://nuscenes.org/fromnuscenes.nuscenesimportNuScenesnusc=NuScenes(version='v1.0-mini',dataroot='/media/algo/data_1/project_others/0000paper/lss/nuScenes/mini/',verbose=True)nusc.list_scenes()my_scene=n......
  • 新版idea快捷键总结学习----(用于java开发模式)
    选择代码区ctrlw如果放到以if开头的语句,可以选择if判断条件所在的代码片段游标在单个单词下时选择单词在选中多个单词时,选择整个字符串三次点击时,如果不在字符串单词下,用于选择{}内的代码片段逐级递增如果在单词下方,用于选择单词所在的字符串并且向外逐级扩展。ctrl......
  • JPA使用实例
    当然,以下是一个更详细的JPA示例代码,涵盖了实体类的关系映射、查询、插入、更新和删除操作:importjavax.persistence.*;@Entity@Table(name="students")publicclassStudent{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;......
  • Less从入门到精通
    目录Less从入门到精通Less预处理语言1.less安装和使用1.1学习目标1.2CSS的短板1.3预处理语言的诞生1.4less介绍1.5less的使用1.5.1注释1,5,2less变量1.6总结2.less变量2.1学习目标2.2选择器变量2.3属性变量2.4url变量2.5声明变量2.6变量运算2.7变量作用域2.8用变......
  • ROCKETMQ
    配置环境变量(ROCKETMQ_HOME)修改runserver.cmd1、进入bin目录下找到runserver.cmd文件,用编辑器打开,因为RocketMQ默认需要2g运行内存,做为测试用,就只要最低配置就好了,注释原有的NameServer的配置,在其前面加上rem注释掉,remset"JAVA_OPT=%JAVA_OPT%-server-Xms2g-Xmx2g-Xmn1......
  • flask跨域
    跨域(Cross-Origin)是指在Web开发中,浏览器限制了从一个源(域、协议和端口)向另一个源发送HTTP请求的操作。简单来说,如果网页的JavaScript代码试图通过XMLHttpRequest、FetchAPI等方式向不同源的服务器发送请求,浏览器会根据同源策略(Same-OriginPolicy)进行限制,阻止跨域请求。  ......
  • 自定义方法,实现按指定属性进行去重
    实例:根据age、sex、name对user对象集合进行去重//构建user对象publicclassUser{privateintid;privateStringname;privateintage;privateStringsex;privatedoubleheight;//构造方法、getter和setter略}//创建对象集合List<User......
  • Druid使用实例
    当然,以下是一个详细的Druid示例代码,演示了如何配置和使用Druid连接池:importcom.alibaba.druid.pool.DruidDataSource;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;publicclassDruidDemo{......
  • ⌈力扣⌋删除字符串中的所有相邻重复项
    题目来源:力扣(LeetCode)链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在S上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回......