[유니티 TIPS] 알고 있으면 쓸데 있는 IL2CPP, Mono, AOT, JIT 개념 파헤치기
💡 IL2CPP
🌰 C++
- 객체 지향 (Class가 존재)
- 메모리 관리를 직접 해줘야 함
- Unity 엔진 내부는 C++로 되어 있음
🥕 C#
- C++에 의해 생산성이 좋음
→ 가비지 컬렉터가 메모리를 자동으로 관리
- C++에 비해서는 성능 저하가 있긴 하지만, 메모리 관리로 인한 이점이 매우 큼
🌽 Mono
- .NET 프레임워크에 대응하기 위해 만들어짐
- 멀티 플랫폼에 대응하여 C#을 돌릴 수 있는 프로그램
- JIT 컴파일이라는 기술을 사용하여 런타임 시 코드를 컴파일
🥜 JIT
- Just In Time
- 그때그때 필요할 때 컴파일
- IL은 사람이 읽을 수 있는 중간 형태의 언어
- 인터프리터와는 다른 개념
- 중간 형태의 .NET Assembly(중간 형태)를 가지고 타겟 디바이스에 맞게 컴파일
- 유니티 에디터는 Mono(JIT) 방식 사용
🥔 IL2CPP
- Mono 백엔드의 대안
- IL(Intermediate Language, .NET Assembly)을 CPP로 변환해주는 것
- 변환한 C++ 코드를 사용하여 선택한 플랫폼용 네이티브 바이너리 파일(.exe, .apk, .xap 등)을 생성
- IL2CPP를 통해 유저 코드도 C++로 돌릴 수 있음
→ 전반적인 성능 향상
🍆 AOT
- 네이티브 바이너리를 빌드할 때 특히 타겟 플랫폼에 대해 코드를 컴파일하는 방식
- IL2CPP로 빌드하게 되면 미리 컴파일 된 AOT(Ahead Of Time) 방식으로 돌아가게 됨
→ 개발할 때는 JIT, 빌드할 때는 AOT 사용
🍅 Generic Sharing
-
Generic 함수를 처리할 때 많은 에러 사항 들이 있음
-
C++에서의 Generic → template
template <typename T>
T minimum(const T& lhs, const T& rhs)
{
return lhs < rhs ? lhs : rhs;
}
...
int a = 1;
int b = 2;
itn i = minimum<int>(a, b);
...
float a = 1;
float b = 2;
float i = minimum<float>(a, b);
- 위와 같이 int와 float형으로 사용하게 되면, 컴파일러는 두 가지 버전으로 함수를 따로 만들게 됨
- 비슷해 보이는데 문제가 생기는 이유
→ call by value vs call by reference
- call by value : 데이터를 복제해서 넘기는 것
- call by reference : 데이터의 위치 정보를 넘기는 것
Struct A {
int a, b, c, d, e, f;
}
-
Call by Value
→ 24byte (4byte * 6)
A a;
func(a);
-
Call by Reference
A* a;
func (a);
-
C++의 Reference
→ 주소 값 8byte
A a;
func(&a);
-
C#에서는 Value와 Reference type을 알아서 정의해줌
- Value type : struct, int, char, bool …
- Reference type : Class, string ,array …
- Reference type의 경우 Generic을 하나 만들어서 내부적으로 공유 가능
→ Generic Sharing
- C#은 JIT 방식이기 때문에 기본만 만들어 놓으면 나머지는 그때 그때 만들어서 사용하게 됨
- C++로 변환하게 되면 미리 만들어야 하므로 코드가 길어지게 됨
→ Generic을 많이 사용할수록 IL2CPP 컴파일 과정이 오래 걸리게 됨
- Project Settings - Player - IL2CPP Code Generation
- Faster runtime : 기존 방식. Reference type은 Generic Sharing 사용. Value type은 Generic 코드 확장. 알 수 없는 Value type Generic 발견 시 공유 코드 사용
- Faster (smaller) builds : Value type Generic도 항상 코드 공유 사용
→ 빌드 시간 및 사이즈 감소
→ 런타임 성능은 떨어지게 됨
- 개발할 때는 Faster builds를 사용하더라도 최종 릴리즈는 Faster runtime 사용 권장
출처 - Unity Documentation Mono 개요
출처 - Unity Documentation IL2CPP 개요
ㄲ ㅡ ㅅ !