当前位置: 首页 > news >正文

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游戏逻辑等内容。

int32 EnginePreInit( const TCHAR* CmdLine )
{
	int32 ErrorLevel = GEngineLoop.PreInit( CmdLine );

	return( ErrorLevel );
}

/** 
 * Inits the engine loop 
 */
int32 EngineInit()
{
	int32 ErrorLevel = GEngineLoop.Init();

	return( ErrorLevel );
}

/** 
 * Ticks the engine loop 
 */
void EngineTick( void )
{
	GEngineLoop.Tick();
}
void EngineExit( void )
{
	// Make sure this is set
	RequestEngineExit(TEXT("EngineExit() was called"));

	GEngineLoop.Exit();
}

引擎初始化过程 

#if WITH_EDITOR
		if (GIsEditor)
		{
			ErrorLevel = EditorInit(GEngineLoop);
		}
		else
#endif
		{
			ErrorLevel = EngineInit();
		}
	}

	double EngineInitializationTime = FPlatformTime::Seconds() - GStartTime;
	UE_LOG(LogLoad, Log, TEXT("(Engine Initialization) Total time: %.2f seconds"), EngineInitializationTime);

#if WITH_EDITOR
	UE_LOG(LogLoad, Log, TEXT("(Engine Initialization) Total Blueprint compile time: %.2f seconds"), BlueprintCompileAndLoadTimerData.GetTime());
#endif

	ACCUM_LOADTIME(TEXT("EngineInitialization"), EngineInitializationTime);

	BootTimingPoint("Tick loop starting");
	DumpBootTiming();

	while( !IsEngineExitRequested() )
	{
		EngineTick();
	}

 三、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函数阻塞逻辑线程直到上一帧的渲染线程执行完毕。也就是说逻辑线程和渲染线程是并行执行的,只不过它们之间相差一帧的内容。

相关文章:

  • 叶酸PEG衍生物​DBCO-PEG-Folate,DBCO-PEG-FA,二苯基环辛炔-聚乙二醇-叶酸
  • 【dll】windows下使用vs编译动态链接库dll与使用
  • 2022年ios证书最新申请流程
  • 普冉 PY32F003 资料和入坑方法
  • springboot+微信小程序健康饮食系统毕业设计源码280920
  • 介绍日本日置IM7583阻抗分析仪
  • 如何开始做股票量化交易?
  • 1446_TC275 DataSheet阅读笔记7_部分管脚功能的梳理
  • 优化算法|MOAVOA:一种新的多目标人工秃鹰优化算法(Matlab代码实现)
  • 基于Springboot+vue的茶叶销售商城网站 elementui
  • goframe的学习
  • 为什么 SQL 是 2022 年收入最高的编程语言
  • windows安装mysql5.7.35
  • ES6 Promise链式调用解决异步回调
  • Kotlin(十四)泛型
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 2019年如何成为全栈工程师?
  • 30天自制操作系统-2
  • 345-反转字符串中的元音字母
  • flutter的key在widget list的作用以及必要性
  • Java面向对象及其三大特征
  • Lsb图片隐写
  • nodejs:开发并发布一个nodejs包
  • sublime配置文件
  • webpack+react项目初体验——记录我的webpack环境配置
  • 计算机在识别图像时“看到”了什么?
  • 京东美团研发面经
  • 蓝海存储开关机注意事项总结
  • 利用jquery编写加法运算验证码
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端路由实现-history
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 学习笔记TF060:图像语音结合,看图说话
  • NLPIR智能语义技术让大数据挖掘更简单
  • 仓管云——企业云erp功能有哪些?
  • 整理一些计算机基础知识!
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #1014 : Trie树
  • #Lua:Lua调用C++生成的DLL库
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (2.2w字)前端单元测试之Jest详解篇
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (一)基于IDEA的JAVA基础12
  • (译)计算距离、方位和更多经纬度之间的点
  • .md即markdown文件的基本常用编写语法
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET 解决重复提交问题
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET6 命令行启动及发布单个Exe文件
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded