[Unity3D] Mono, IL2CPP, AOT, JIT
1. IL2CPP
유니티 엔진의 내부는 C++로 구성되어있다.
따라서, 유니티가 C#을 사용하여 느리다 라는 것은 어느 정도 잘못된 말이지만
개발자 스크립팅 부분은 C#을 사용하였기에 아쉬운 점이 있던 것은 사실이다.
하지만, IL2CPP는 이런 유니티의 단점을 커버해준다.
IL2CPP는 Unity 프로젝트의 성능, 보안 및 플랫폼 호환성을 개선하는 등의 용도로 사용된다.
IL2CPP는 결과적으로 스크립팅 부분도 C++로 돌아가게끔 해주기 때문이다.
2. Mono
IL2CPP에 대해서 자세하게 알아보기 전에 몇가지 더 알아둬야 할 것이 있다.
본래 C#은 MS에서 윈도우 전용으로나 사용되던 언어였다. (현재는 .NET Core를 사용한다.)
IOS나 안드로이드 같은 다른 환경에서는 .NET Framework가 구동되지 않았기 때문이었다.
크로스 플랫폼이 기본이 되어가는 어플리케이션 환경 속에서
이런 C# .NET의 단점은 너무나도 치명적이었다
이 단점을 보완하기 위하여 시미안(Ximian)이라는 곳에서 Mono 프로젝트가 오픈 소스로 공개되었고
Mono 프로젝트는 여러 플랫폼에서 .NET을 사용할 수 있게 해주었다.
현재는 MS에서 인수하여 개발을 진행하고 있다.
Unity 또한 게임 어플리케이션을 주로 개발하는데 사용하기에 Mono로 빌드하여 사용하였으나,
Mono 프로젝트가 오래되었고 IOS 환경에서 구동할 수 없는 치명적인 단점.
JIT(Just In Time) 방식의 컴파일러이기 때문에 유연하지만 느리다는 단점이 있어서 (게임은 퍼포먼스가 중요하다.)
IL2CPP라는 스크립팅 백엔드를 개발하게 된다.
3. IL2CPP의 특징
IL2CPP는 AOT(Ahead Of Time) 방식으로 구동된다.
말 그대로 소스 코드를 '미리' 컴파일 하는 방식으로 CIL을 C++로 미리 바꿔서 사용한다.
Mono의 JIT 방식은 코드를 CIL로 가지고 있다가 플랫폼에 맞춰 변환한다.
IL2CPP가 미리 컴파일 된 방식을 사용하는 만큼 속도 면에서 더 유리하다.
하지만, JIT 방식이 가지고 있던 핫 리로드와 같은 장점은 사용할 수 없다.
또한, IL2CPP로 빌드된 파일은 디컴파일로 코드를 제대로 확인하기 힘들어
어셈블리로 해석해야 하는 상황에 놓이기 때문에 최소한의 보안 역할도 할 수 있다.
4. IL2CPP의 구동 방식
- Unity 스크립팅 API코드를 일반 .NET DLL로 컴파일
- 관리되는 바이트코드 스트리핑을 적용 -> 빌드된 게임의 크기를 크게 줄여줍니다.
- 모든 관리되는 어셈블리를 표준 C++ 코드로 전환
- 생성된 C++코드와 IL2CPP의 런타임 부분을 네이티브 플랫폼 컴파일러로 컴파일
- 대상 플랫폼에 따라 실행 가능한 파일이나 DLL에 코드를 연결
더 간단하게 보면 아래의 그림과 깉이 될 것이다.
https://www.youtube.com/watch?v=-9X965jXrn8