흔한 덕후의 잡동사니

IL2CPP, Mono, AOT, JIT 개념 정리 본문

GameEngine/Unity

IL2CPP, Mono, AOT, JIT 개념 정리

chinodaiski 2025. 2. 6. 23:20

1. IL2CPP란?

IL2CPP(Intermediate Language To C++)는 유니티에서 C#으로 작성된 코드를 IL(Intermediate Language)로 변환한 후 C++ 코드로 변환하여 네이티브 바이너리를 생성하는 스크립팅 백엔드다. 이를 통해 실행 성능을 높이고 보안을 강화할 수 있다. 기존 Mono 방식에서는 C# 코드를 IL로 전환하고 실행하는 반면, IL2CPP는 IL에서 추가적인 변환 과정을 거쳐 만들어진 네이티브 코드로 실행된다.

Mono와 IL2CPP의 컴파일 과정

 

Unity의 내부는 C++로 작성되어 있으며, 개발자는 C#을 사용하여 API에 접근한다. IL2CPP를 사용하면 C# 코드도 C++로 변환되므로, 전체적인 성능이 향상된다.

또한 C#은 메모리 관리 및 쓰레드 관리가 자동화되어 있어 생산성이 높지만, 성능이 상대적으로 낮다. 반면 C++은 성능이 뛰어나지만 메모리 관리가 복잡하다. 이런 이유로 IL2CPP를 사용해 C#의 생산성과 C++의 성능을 절충하는 역할을 한다.

 

2. Mono와 IL2CPP의 차이

Unity에서는 Mono와 IL2CPP 두 가지 런타임을 사용할 수 있다.

 

Mono는 C# 코드를 즉시 실행할 수 있는 런타임 환경이다. 주로 JIT(Just-In-Time) 방식을 사용하여 런타임에 코드를 컴파일하고 실행한다. 반면 IL2CPP는 AOT(Ahead-Of-Time) 방식으로 미리 C++로 변환한 뒤 빌드 과정에서 네이티브 코드로 컴파일한다. 이 차이로 인해 IL2CPP는 실행 속도가 빠르고, 보안성이 높지만 빌드 시간이 길어지는 단점이 있다.

 

이런 이유로 JIT는 유연하지만 성능이 낮고, AOT는 실행 속도가 빠르지만 유연성이 낮다고 평가된다.

 

3. AOT와 JIT

AOT(Ahead-Of-Time): 실행 전에 미리 컴파일하는 방식이다. IL2CPP는 AOT 방식을 사용하여 성능을 최적화한다. 단점으로는 모든 코드를 미리 컴파일해야 하므로 유연성이 낮고, 리플렉션 기반 기능을 지원하기 어렵다.

JIT(Just-In-Time): 런타임에 필요한 부분만 즉시 컴파일하여 실행하는 방식이다. Mono가 JIT 방식을 사용하며, 개발 중 빠른 반복 테스트가 가능하다는 장점이 있다.

 

4. IL2CPP의 장점과 단점

[ 장점 ]
네이티브 코드로 변환되므로 실행 속도가 빠르고 보안성이 높아 디컴파일이 어렵다.
다양한 플랫폼에서 실행할 수 있다.

[ 단점 ]
변환과정이 추가되기에 빌드 시간이 길어진다.

리플렉션 사용이 제한적이다.

디버깅이 C#에 비해 상대적으로 어렵다고 한다.

 

5. IL2CPP가 필요한 경우

모바일 플랫폼(Android, iOS)에서 성능 최적화가 필요할 때
보안 강화를 위해 C# 코드 보호가 필요할 때
WebGL 빌드와 같이 AOT 컴파일이 필수인 경우

 

결론은 IL2CPP를 사용하면 유저 스크립트 코드도 네이티브 C++ 코드로 변환되어 실행되므로, 기존 Mono 방식보다 실행 속도가 빨라지고 최적화가 가능하다. 그래서 마지막에 배포할 때 무조건 [ IL2CPP로 컴파일해서 배포하는게 성능에 최적화 ]되어 있다고 한다. 과정만 봐선 성능이 확실히 향상될 것으로 보이지만 얼마나 최적화 되고 성능이 좋은지에 대해선 검증이 필요하다. 관련 내용은 추후 작성 예정.

 

 

참조

https://www.youtube.com/watch?v=-9X965jXrn8

'GameEngine > Unity' 카테고리의 다른 글

Collider 컴포넌트의 Trigger 옵션에 대하여  (0) 2025.02.10
Raycast 와 그 사용법에 대하여  (0) 2025.02.09
C#의 object, Unity의 Object의 차이  (0) 2025.02.05
객체의 회전에 대하여  (0) 2025.02.03
TransformDirection()  (1) 2025.02.02