一、引擎主循环
UE版本:4.27
一、引擎主循环的位置:
Launch.cpp : Guarded Main函数
二、、Guarded Main函数执行逻辑:
1、EnginePreInit:加载大多数模块
int32 ErrorLevel = EnginePreInit( CmdLine );
PreInit模块加载顺序:
模块加载过程:
(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)
(2)调用模块的StartUpModule方法
2、FEngineLoop::Init()
1、 检查Engine的配置文件找出使用了哪一个GameEngine类(UGameEngine和UEditorEngine,均派生自UEngine)
2、 创建该类的实例,并让全局UEngine指针(GEngine)指向该实例
(3)触发全局委托告知引擎已初始化
(4)加载插件和项目模块
(5)引擎启动成功
3、UGameEngine:
调用顺序:
(1)UGameEngine::Init:
会在地图加载完之前进行初始化,初始化过程会创建
GameInstance、GameViewportClient、LocalPlayer对象,之后游戏启动
创建GameInstance:
创建GameViewportClient,代表屏幕本身:
创建LocalPlayer,代表坐在屏幕前的用户,之后游戏启动:
(2)LoadMap的作用:
加载在DefaultEngine.ini中定义的地图,将会创建UWorld对象(保存游戏地图中所有的AActor)、以及一些在游戏地图加载后才生成的对象
上:在游戏地图加载前生成的对象
下:在游戏地图加载后生成的对象
当切换新地图中,地图中的所有对象都会被销毁,UWorld对象被清空(不使用seamless travel)
(3)LoadMap加载World的过程(UEngine::LoadMap):
1、触发全局委托表明游戏地图更换,如果当前已经加载一张地图,会清理并销毁当前World
2、GameInstance加载World
3、加载WorldPackage,创建UWorld对象,
4、在World中保存对GameInstance的引用,World对象的引用保存在WorldContext中,并将其世界类型设置为Game。
AddToRoot:防止被垃圾回收;
InitWorld:让World对象能够对一些物理,寻路,AI和声音的系统进行设置;
SetGameMode:World对象会让GameInstance在世界生成一个GameMode的Actor对象,同时所有引用到的资产都会被加载:
5、InitializeActorsForPlay:
(1)首先会注册世界中的所有Actor组件(Actor上的每一个Component也要被注册);Component注册过程(UActorComponent::RegisterComponentWithWorld)。
(2)Component被注册后,World会调用GameMode的InitGame方法,GameMode会生成一个GameSession类的Actor对象:
(3)RouteActorInitialize:
World遍历每一个Level初始化所有Actor对象,每个Actor会先调用PerInitializeComponent方法,做初始化的早期工作;GameMode作为Actor也会在这是被调用,并生成GameState对象,并将其关联到World对象中。;
之后还会对所有Actor进行一个遍历,这次会调用InitializeComponents和PostInitializeComponents方法,完成World的初始化。
6、Spawn Actor
遍历GameInstance里的所有Local Player
7、处理登录过程
8、LoadMap总结
Engine -> World World -> GameMode -> GameState
(4)游戏循环: