Unity Engine은 두 가지 스크립팅 백엔드, Mono와 IL2CPP를 사용합니다.
(스크립팅 백엔드: 스크립트를 컴파일 하는 방식 및 기술)
오늘은 Unity 컴파일 기술인 Mono와 IL2CPP가 어떻게 동작하는지,
그리고 어떤 원리와 특징이 있는지 살펴보겠습니다.
Mono란?
Mono: 런타임 시점에 요청 시 코드를 컴파일하는 JIT(Just-In-Time) 컴파일 방식
C#은 .NET 런타임 환경에서만 작동하기 때문에 IOS, Android에서는 작동하지 않습니다.
그래서 Unity는 Mono를 사용하여 여러 플랫폼에서 작동할 수 있도록 설계합니다.
💡 Mono가 작동하는 방식
1. .NET에서 C#을 중간 언어인 IL(Intermediate Language)로 변환
2. Mono에서 런타임으로 IL을 실행
정리하면 Mono는 IL이라는 중간 언어를 현재 플랫폼에 맞춰 컴파일하는 방식입니다.
즉, Mono를 활용하여 멀티 플랫폼 환경을 제공합니다.
IL2CPP란?
IL2CPP: 실행 전에 전체 애플리케이션을 컴파일하는 AOT(Ahead-of-Time) 컴파일 방식
IL2CPP는 IL 언어를 cpp(C++ 소스 파일)로 변환한다는 의미를 가지고 있습니다.
런타임이 아닌, 빌드 과정에서 미리 C++로 컴파일하여 여러 플랫폼에서 바로 사용할 수 있도록 합니다.
따라서 런타임 속도가 빠릅니다.
하지만 빌드 과정이 느려지는 단점이 존재합니다.
그래서 주로 기능 테스트의 경우 빠른 빌드를 위해 Mono 컴파일 방식을 사용하고,
릴리즈의 경우 빠른 실행을 위해 IL2CPP 컴파일 방식을 사용합니다.
💡 Generic Sharing 문제
Call by reference(데이터 위치를 넘김)와 Call by value(데이터 값 넘김)이 C#과 C++은 서로 다르게 동작합니다. C++에서는 개발자가 위 2가지 방식을 선택할 수 있지만, C#에서는 자료형에 따라 결정됩니다.
또한, C#의 Generic은 런타임에서 동작하지만, C++의 Template는 컴파일에서 자료형 별로 코드가 제작됩니다. 따라서 C# 언어를 C++로 변환하는 과정에서 엄청난 양의 코드가 발생합니다. 특히 Generic을 조건(where) 없이 남용한다면 IL2CPP 빌드 과정이 매우 느려질 수 있습니다.
참고 자료
https://youtu.be/-9X965jXrn8?si=m_clZ3IQMjWYo9_z
'유니티(Unity) > 이론 정리' 카테고리의 다른 글
[Unity] URP란 무엇인가? (0) | 2024.11.20 |
---|---|
[Unity] 직렬화(Serialization)란 무엇인가? (1) | 2024.11.19 |
[Unity] .NET이란? (4) | 2024.11.17 |
Unitask의 개념과 사용법 (0) | 2024.11.14 |
코루틴(Coroutine)의 개념과 동작 원리 (4) | 2024.11.13 |