一、引擎主循环
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)游戏循环:
|