UE4之Slate: App启动与最外层Runtime结构

UE4版本:4.24.3源码编译;

Windows10 + VS开发环境

Slate为一套自定义UI框架,其绘制直接依赖的是OpenGL、DirectX这样的硬件加速AIP;
可以理解为一个单独的2D图形渲染引擎,如果有其他开源2D引擎(比如Cocos2d-x)的基础会更好的理解Slate;

UE4引擎的源代码以模块的方式组织,最直观的感受是查看源码目录:Engine/Source/Runtime目录中,每个子目录都是一个模块;

抛开所有的细节,UE4作为一个GUI App,总会有个一般的启动流程和App Tick(Loop),这里记录一下该最外层的对象结构;

1、App入口:

源码Engine/Source/Runtime/Launch为启动模块;

定义在Engine/Source/Runtime/Launch/Private/Launch.cpp中的GuardedMain(...)函数是UE4的统一[入口函数];

真正的平台相关的入口函数在各平台对应的源码文件中定义,比如Windows平台下会有:
Engine/Source/Runtime/Launch/Private/Windows/LaunchWindows.cpp中定义的WinMain(...)函数,

2、运行时调用流程

查看Engine/Source/Runtime/Launch/Private/Launch.cpp中的GuardedMain(...)函数,内部依次调用:

 EnginePreInit(...) ---> EngineInit() ---> 循环调用EngineTick() ---> EngineExit()

上面每个函数内部调用的是GEngineLoop这个对象的对应函数
详情可以查看Engine/Source/Runtime/Launch/Public/LaunchEngineLoop.h/Engine/Source/Runtime/Launch/Public/LaunchEngineLoop.cpp对应的源码;

3、总结:

1、以上的App入口和运行时调用流程,只是一般意义上,或者说概念上的;UE4 C++源码中有很多的全局对象,每个全局对象的构造时机都是比Main函数要早的;

2、iOS、Android移动平台的App生命周模型下,不会调用上面说的入口函数GuardedMain(...);而是基于生命周期接口中调用GEngineLoop对象的对应函数;详细的可以参看Engine\Source\Runtime\Launch\Private\IOS\LaunchIOS.cpp、Engine\Source\Runtime\Launch\Private\Android\LaunchAndroid.cpp对应的源代码;

UE4 Runtime源代码量巨大,加上源码中间夹杂个各种宏定义、Editor相关的代码,查看源码过程中容易淹没的细节中;

可取的源码阅读方式应该是先了解清楚大体流程,然后每个模块单独分析;配合全局搜索、调用堆栈等方式了解各自模块的运行机制;

了解App运行时流程后,接下来可以去了解Slate模块内部的一些功能实现机制

 

posted @ 2021-03-04 20:22  阿佑001  阅读(515)  评论(0编辑  收藏  举报