Unreal

Unreal Framework - PreInit

춤추는수달 2023. 12. 5. 10:00

저번 글에서는 언리얼 프레임워크의 큰 틀에 대해서 알아보았다. 이번엔 언리얼 엔진의 PreInit 과정에 대해 좀 더 자세히 알아보도록 하겠다.


GEngineLoop

언리얼 엔진의 메인 함수에서 'int32 ErrorLevel = EnginePreInit( CmdLine );' 와 같은 선언문으로 PreInit 작업이 시작됩니다.

EnginePreInit 함수 내부에서는 간단히 GEngineLoop 객체의 PreInit() 이라는 함수를 호출해줍니다. GEngineLoop 객체는 Laucn.cpp에 전역 변수로 선언되어 있습니다. 참고로 GEngineLoop 객체는 이후에도 Init 과정과 Tick 과정에도 사용됩니다. GEngineLoop 객체의 역할은 메인 엔진 루프 구현입니다.

//Launch.cpp
FEngineLoop	GEngineLoop;

/** 
 * PreInits the engine loop 
 */
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 
 */
LAUNCH_API void EngineTick( void )
{
	GEngineLoop.Tick();
}

 

PreInit

PreInit 과정에서 주로 하는 일은 '모듈, 엔진, 프로젝트 로딩' 입니다. FEngineLoop::PreInit 함수에서는 PreInitPreStartupScreen 함수와 PreInitPostStartupScreen 함수를 호출해 PreInit 작업을 합니다. 그런데 두 함수의 내용을 보면 엄청난 양의 온갖 초기화 코드들로 가득합니다. 이러한 초기와 코드들을 분석하는 것은 비효율적이라고 생각되어 대충 훑어보고 넘어가겠습니다.

PreInit 과정에서는 대강 아래와 같은 작업을 수행합니다.

  • Low-Level 엔진 모듈(CoreUIModule, Engine, Renderer 등) 로딩, 필수 시스템 초기화, 필수 타입 정의
  • 초기 로딩 페이즈에 필요한 프로젝트, 플러그인 로딩
  • High-Level 엔진 모듈(Core, Networking, UMG, PacketHandler 등) 로딩
  • 프로젝트, 플러그인 로딩
  • UObject 기본 클래스 등록
  • CDO 생성 및 생성자 호출로 초기화
  • StartupModule 함수 호출 : 모듈 시작 시 초기화 기회 제공.

PreInit 과정은 제 입장에서는 아직까지 건드릴 일도 없고, 중요도가 떨어진다고 생각해서 대충 알아봤는데요, 다음 글에선 Init 에 대해 알아보겠습니다. 


참고 자료 : https://www.youtube.com/watch?v=IaU2Hue-ApI&list=PLgIBMlWm501pi21I23ad4cwpJBGNuKi_h&index=6