Scripting Backend - Mono vs IL2CPP

Posted by Eun JongHyeok on May 10, 2024
  1. C# compilation
    1. 컴파일 타임
    2. 실행 타임
  2. 스크립트 백엔드
    1. Mono
    2. IL2CPP
  3. 결론

C# compilation

028
출처

유니티는 다양한 멀티 플랫폼을 지원하고 있습니다.
예를 들어 Windows뿐만 MacOS, Linux에서 유니티 에디터를 실행시켜서 즉석에서 플레이 모드를 진행해 볼 수 있고 그 이외 다른 Android, iOS 등 모바일 플랫폼으로 빌드를 할 수 있습니다.
Mono vs IL2CPP에 대해 설명하기에 앞서 일반적인 C# 스크립트가 어떻게 컴파일되는지 알아보도록 하겠습니다.

컴파일 타임

C#을 포함한 여러 .Net 기반 언어들은 우선 각자의 언어에 맞는 Compiler를 통해서 Common Intermediate Language code(CIL)을 생성합니다. 해당 코드들은 exe나 dll과 같은 어셈블리 파일에 들어갑니다.

실행 타임

이후 Runtime에는 일반적으로 Common Language Runtime(CLR) 안에 있는 just-in-time compiler(JIT)가 각 플랫폼에 맞는 기계어로 변환해 줍니다.

스크립트 백엔드

029 다시 원점으로 돌아와서 그럼 유니티에서 설정하는 스크립팅 벡엔드는 무엇이냐 하면 Intermediate Language(IL)까지 생성한 뒤 이 IL을 무엇을 통해 기계어로 바꿀지 결정하는 것입니다.
그럼 각 설정별 특징을 간단히 알아보겠습니다.

Mono

Mono는 오픈 소스 .NET 구현체로 기존 Windows에서만 실행되었던 .Net Framework를 여러 플랫폼에서 실행할 수 있도록 개발되었습니다. Mono에도 C# Compiler가 구현되어 있습니다. 과거에는 유니티에서 Mono의 C# Compiler를 사용했지만 현재는 Roslyn을 사용하고 있습니다.
하지만 여전히 Runtime 구현부는 Mono를 사용할 수 있습니다. 이때 JIT 방식을 사용합니다.

IL2CPP

IL2CPP 옵션은 말그대로 IL을 C++로 변환한 뒤 C++ Compiler를 통해서 기계어로 변환됩니다. C++ Compiler는 Ahead of Time(AOT) 방식을 사용하여 런타임 전에 미리 컴파일 진행하여 런터임에 따로 컴파일이 필요 없습니다. 또한 최적화 작업까지 되어 빌드에는 조금 오래 걸리더라도 성능적인 면에서 장점이 있습니다.

결론

플랫폼 별로 JIT, AOT 둘 다 지원하는 곳도 있고 둘 중 하나만 지원하는 경우도 있습니다.
간단한 샘플 프로젝트를 만들 경우 Mono를 사용하는게 좋아보이고 성능이나 보안적인 측면이 중요하다 생각되면 IL2CPP을 사용하는게 좋아보입니다.
각각의 상황에 맞게 적용하도록 합시다.


Mono
IL2CPP
_NET
Roslyn
CLR
JIT
AOT
CIL

← Previous Post Next Post