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

这篇具有很好参考价值的文章主要介绍了UE4 源码解析----引擎初始化流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

一、引擎的函数入口

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

Windows函数入口

UE4 源码解析----引擎初始化流程 引擎入口函数为:GuardedMain

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

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

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();
}

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

引擎初始化过程 

#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();
	}

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

 三、FEngineLoop::PreInit()函数

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

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

 四、FEngineLoop::Init()函数

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

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

 五、FEngineLoop::Tick()函数

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

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

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

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

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

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

最后通过FrameEndSync.Sync函数阻塞逻辑线程直到上一帧的渲染线程执行完毕。也就是说逻辑线程和渲染线程是并行执行的,只不过它们之间相差一帧的内容。文章来源地址https://www.toymoban.com/news/detail-462545.html

到了这里,关于UE4 源码解析----引擎初始化流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从内核源码看 slab 内存池的创建初始化流程

    在上篇文章 《细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现 》中,笔者从 slab cache 的总体架构演进角度以及 slab cache 的运行原理角度为大家勾勒出了 slab cache 的总体架构视图,基于这个视图详细阐述了 slab cache 的内存分配以及释放原理。 slab cache 机制确实比

    2023年04月12日
    浏览(52)
  • Hotspot源码解析-第十九章-ClassLoaderData、符号表、字符串表的初始化

    讲解本章先从一张图开始 众所周知,Java类的相关信息都是存储在元空间中的,但是是怎么存储的,相信很多读者是不清楚的,这里就不得不涉及到ClassLoaderDataGraph、classLoader、classLoaderData(简称CLD)和Klass的概念及他们四者的关系,这里简单描述下他们的概念,具体细节放到

    2024年01月17日
    浏览(46)
  • SIM初始化流程

    ATR(Answer To Reset):复位应答信号,有SIM卡传输给终端,包括SIM卡自身的一些信息,比如支持的传输速率,传输模式等。   SIM卡的ATR代表\\\"Answer to Reset\\\",即复位响应。当SIM卡被插入设备中时,设备会向SIM卡发送一个复位命令,以获取SIM卡的响应。 SIM卡会回复一个ATR,其中包含有

    2024年02月04日
    浏览(47)
  • 【虚幻引擎】UE4源码解析FWorldContent、UWorld、ULevel、UGameInstance、UEngine

    Engine,因为也是很基础的类,再加上开发过程中会经常访问到该类型,因此UE4引擎也在代码全局范围内定义了一个该类型的全局变量:UEngine* GEngine供开发者直接调用。该最基础的类型分化成了两个子类:UGameEngine和UEditorEngine。 UGameEngine保存了唯一的一个UGameInstance* GameInstanc

    2024年02月16日
    浏览(39)
  • Android性能优化之游戏引擎初始化ANR

    近期,着手对bugly上的anr 处理,记录下优化的方向。 借用网上的一张图: 这里的anr 问题是属于主线程的call 耗时操作。需要使用trace 来获取发生anr前一些列的耗时方法调用时间,再次梳理业务,才可能解决。 问题1 java 调用栈: 从调用栈中发现onActivityResult()执行对游戏侧的

    2024年02月15日
    浏览(48)
  • Android 11属性系统初始化流程

    在init进程启动的第二阶段,调用PropertyInit 对属性系统进行初始化 PropertyInit函数在systemcoreinitproperty_service.cpp 中实现 注释1处在dev下创建__properties__文件夹。注释2处会收集读取各个分区下的property_contexts文件,将读取到的信息系列化之后,写到/dev/ properties /property_info文件中。

    2024年04月09日
    浏览(63)
  • Android---Class 对象在执行引擎中的初始化过程

    一个 class 文件被加载到内存中的步骤如下图所示: 装载  装载是指 Java 虚拟机查找 .class 文件并生成 字节流 ,然后根据字节流创建 java.lang.Class 对象的过程。 1. ClassLoader 通过一个类的 全限定名 ( 包名+类名 )来查找 .class 文件,并生成二进制字节流。其中 class 字节码文件

    2024年02月07日
    浏览(50)
  • 【Git】初始化仓库配置与本地仓库提交流程

    目录 一、仓库配置邮箱与用户名 二、本地仓库提交流程 【Git】Linux服务器Centos环境下安装Git与创建本地仓库_centos git仓库搭建_1373i的博客-CSDN博客 https://blog.csdn.net/qq_61903414/article/details/131260033?spm=1001.2014.3001.5501 在之前的文章里我们学习了如何在centos系统上安装git以及使用gi

    2024年02月15日
    浏览(49)
  • 【SA8295P 源码分析】86 - AIS Camera Device 设备初始化 之 AisProcChainManager 模块初始化源码分析

    【源码分析】 因为一些原因,本文需要移除, 对于已经购买的兄弟,不用担心,不是跑路, 我会继续持续提供技术支持, 有什么模块想学习的,或者有什么问题有疑问的, 请私聊我,我们 +VX 沟通技术问题,一起学习,一起进步 接下来,我一一私聊已经购买的兄弟添加V

    2024年02月10日
    浏览(44)
  • 【PostgreSQL】Ubuntu 下使用 Prisma 的初始化流程

    步骤如下: 创建 Ubuntu 用户 创建 PostgreSQL 用户 使用 postgres 用户登录,然后创建新用户: 设置用户密码 使用 postgres 或 projectname 用户登录,设置用户密码: 完成上面准备工作就ok了,不需要手工创建数据库,因为下面将由 Prisma 来创建数据库。 Prisma 初始化 schema.prisma 创建好

    2024年01月18日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包