언리얼 엔진에서 인라인 함수(inline function) 는 성능 최적화와 관련한 중요한 개념이다.
인라인 함수는 함수 호출 시 함수의 본문 코드가 호출된 위치에 직접 삽입
되는 방식으로 처리되는 함수이다.
일반적인 함수 호출에서는 stack에 호출 정보를 저장하고 제어를 함수로 이동하는 과정이 필요하지만, 인라인 함수는 이러한 호출에 관련한 overhead를 없앤 최적화 방법이다.
솔직히 설명만으로는 잘 이해가 되지 않아 실제 적용 예시를 찾아보았다.
// inline 미적용한 일반함수
int Add(int a, int b) {
return a + b;
}
int main() {
int result = Add(3, 4);
return 0;
}
즉, 이런 식으로 일반적인 function이나 method를 활용하는 것은
코드 재사용성의 증가로 메모리 사용에 효율적이나,
함수 호출과 복귀에 필요한 스택 작업으로 인해 오버헤드가 발생하기 때문에,
단순한 함수를 자주 호출하게 되면 성능에 부정적인 영향을 준다.
는 효과를 가지는 것으로 정리해 볼 수 있다.
// FORCEINLINE 매크로를 적용한 inline 함수
FORCEINLINE int Add(int a, int b) {
return a + b;
}
int main() {
int result = Add(3, 4);
return 0;
}
Add 함수가 호출 과정을 생략하여 스택, 제어 흐름 변경 없이, 컴파일러가 함수의 코드를 복사 삽입하여 3 + 5가 직접 실행
인라인 함수는 일반 함수가 갖는 호출 과정이 없기 때문에 호출에 필요한 비용 오버헤드 없이 빠른 실행속도를 가진다.
이러한 inline 함수를 다루는데에 있어, FORCEINLINE
은 언리얼 엔진에서 제공하는 매크로로, 컴파일러에게 특정 함수에 대해 반드시 인라인 처리를 하도록 강제하는 역할을 한다.
이는 기본적으로 컴파일러의 판단을 무시하고 무조건 인라인을 적용하는 방식으로, 플랫폼에 따라 다르게 정의된다.
// Windows 환경
#define FORCEINLINE __forceinline
주의사항
너무 큰 함수에 FORCEINLINE을 사용하면 코드 크기가 급격히 증가하게 되어 코드의 메모리 사용량 증가 및 성능 저하를 가져올 수 있기 때문에,
강제적인 인라인을 적용하는 FORCEINLINE
매크로는 신중하게 성능 병목 지점에서만 사용하는 것이 좋다.
// 벡터 계산 함수
FORCEINLINE FVector AddVectors(const FVector& A, const FVector& B) {
return FVector(A.X + B.X, A.Y + B.Y, A.Z + B.Z);
}