프로그래밍/언리얼엔진

[언리얼엔진] IWYU(Include-What-You-Use) 모델

LeePorter 2023. 1. 4. 22:36

언리얼 엔진은 4.16부터 IWYU 모델을 사용하여 코드 컴파일을 최적화 하였습니다.

과거에는 Engine.h 또는 UnrealEd.h와 같은 모놀리식(하나의 큰 덩어리) 헤더 파일을 포함하여 한꺼번에 컴파일을 하다보니 개발할 때 컴파일 시간이 너무 많이 소요되고 병목현상이 발생하였습니다.

 

그래서 4.16부터 컴파일 속도를 최소화하는 목적으로 등장한 것이 IWYU 모델입니다.

IWYU는 Include-What-You-Use, 해석하면 '너가 원하는 것만 포함'하라는 의미입니다.

 

과거에는 `Engine.h` 혹은 `EngineMinimal.h` 등을 프로젝트 모듈 헤더에 추가한 뒤 해당 모듈 헤더를 각각 새로 추가한 클래스 소스(cpp파일)에 추가하여 사용하는 식이어서 별도의 엔진 헤더를 추가할 필요없이 바로 사용할 수 있었습니다.

 

하지만 IWYU 모델을 사용하게 되면 각각 새로 생성한 클래스 헤더에 `CoreMinimal.h`를 추가하여 최소한의 코드만 클래스에 Include하여 사용하고, 이 외의 코드는 cpp 소스파일에 하나씩 추가하고, 헤더에 선언할 때에는 전방선언(`class StaticMeshComponent;`)으로 작업합니다.

 

이렇게하면 코드 최적화도 되고, 컴파일 속도도 빠르게 수행할 수 있지만 단점은 내가 사용하고자 하는 헤더파일이 어디있는지 언리얼 API 문서를 통해서 하나하나 확인해야하기 때문에 잘 모르는 초보자들은 찾기가 어려울 수 있습니다.

 

그래서 초보자들은 우선 블루프린트를 사용하여 엔진에서 사용하는 클래스들이 무엇이 있는지 먼저 파악하고 C++로 변환하는 작업을 해보는게 도움이 됩니다.

 

IWYU 모델이 적용된 헤더모습. 매우 적은 양의 핵심 헤더만 포함하고 있다.기존의 헤더 모습. 엄청난 양의 헤더를 한 번에 참조하고 있기 때문에 느리다.
(좌) CoreMinimal.h / (우) Engine.h 두 헤더 라인 숫자만 봐도 차이가 엄청나다.

 

IWYU 모델을 사용하여 작업하다보면 간혹 IWYU 정책에 따라서 제대로 코드를 작성해도 빨간줄(에러) 표시를 해줄때가 있습니다.

 

실제 빌드할 때 영향을 주지 않는 경우에는 Intellisense의 오작동이므로 관련된 내용은 언리얼 엔진의 Visual Studio 설정 관련한 Document를 참고해주시면 됩니다.

 

 

언리얼 엔진용 Visual Studio 구성

언리얼 엔진 4 에서 작동하도록 Visual Studio 를 구성하는 팁입니다.

docs.unrealengine.com

 

IWYU 모델 사용 시 규칙이 있는데 아래와 같습니다.

 

모든 헤더 파일에는 필수 종속성이 포함된다.

→ 새로 추가한 클래스 헤더에는 항상 `CoreMinimal.h`가 포함되어야 합니다.

 

.cpp 파일은 자신과 일치하는 .h 파일을 먼저 포함한다.

→ 예를 들면 `Test.cpp`의 가장 최상단에는 `Test.h`가 Include 되어야 합니다. 그 위에 다른 엔진 소스를 Include하면 빌드 시 오류가 발생합니다.

 

IWTU 모델 사용 시 반드시 소스파일의 헤더는 가장 최상단에 위치해야한다. 헤더 위에 다른 헤더가 Include 되면 빌드 오류 발생
VRFunctionLibrary.cpp의 일치하는 헤더인 VRFunctionLibrary.h가 먼저 Include 되어야 한다는 오류 발생.

 

PCH 파일은 더이상 명시적으로 포함되지 않는다.

→ 제대로 사용해 본적이 없다보니 자세한 정보는 모르겠지만 현 시점에서 PCH 파일은 여전히 사용은 하지만 UnrealBuildTool(UBT)에 의해서 컴파일러 명령 줄에 강제 포함된다고 함.

 

모놀리식 헤더 파일은 더 이상 포함되지 않는다.

→ `Engine.h` 또는 `UnrealEd.h`와 같은 헤더는 더 이상 사용하지 않는다. 사용할 경우 경고를 출력한다.

참고로 `Engine/Engine.h` 헤더는 전혀 다른 헤더이다. 주로 `GEngine`, `UEngine`을 사용할 때 사용한다.

ex) `#include "Engine/Engine.h"`

 

위의 규칙을 준수하면서 IWYU를 사용하도록 설정하기 위해서는 Build.cs 파일에 `PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;` 가 추가되어야 합니다.

(최신 언리얼 엔진 버전에서는 C++ 프로젝트 생성 시 기본적으로 추가되어 있음.)

 

이상 IWYU 모델에 관한 설명이었습니다.

감사합니다.