내가 일하며 알게 된 프로그래밍
article thumbnail

IL2CPP

단어 뜻만 보자면

IL to CPP

유니티에서 사용하는 중간 언어(Intermediate Language) 를 C++ 코드로 변환한다는 뜻

IL2CPP는 .NET 환경을 지원하지 않는 플랫폼에서 게임을 실행할 수 있도록 지원한다.

진행 방식은
아래 처럼 코드를 작성했다고하면

public int Add(int a, int b)
{
    return a + b;
}

아래 처럼 중간언어(IL)로 변경 후 C++언어로 다시 변경하는 방식이라고 한다

.method public hidebysig instance int32 Add(int32 a, int32 b) cil managed
{
  // Code size       7 (0x7)
  .maxstack  2
  .locals init (int32 V_0)
  IL_0000:  nop
  IL_0001:  ldarg.1
  IL_0002:  ldarg.2
  IL_0003:  add
  IL_0004:  stloc.0
  IL_0005:  br.s       IL_0007
  IL_0007:  ldloc.0
  IL_0008:  ret
}

(위 IL코드를 예시 CPP코드로 변경한다면 코드가 매우 복잡하다기에 어떻게 되는지 파악하지못했다)

 

IL2CPP의 빌드 시
장점
1. 코드를 난독화하기 때문에 코드를 리버스 엔지니어링 하거나 수정하기가 어려워진다.
2. .NET환경이 아닌 다양한 플랫폼을 지원 (모든 플랫폼을 지원하는건 아님)
3. 런타임 성능이 빨라지고 메모리 사용량의 감소를 기대할 수 있다

단점
1. C#코드를 CPP코드까지 변환하기때문에 프로젝트의 크기가 커질수록 빌드시간이 늘어난다.
2. 빌드 파일의 크기가 Mono 빌드에 비해 더 크다
3. 외부 라이브러리 사용 시 IL2CPP 대응이 되지 않는다면 빌드 시 어려움을 겪을 수 있다.

 

**위와같은 장단점이 있지만 그럼에도 불구하고 IL2CPP를 사용해야하는 이유는..
애플의 정책에 따라 Ahead-of-Time (AOT) 방식을 사용해야 하기 때문이다..
(빌드를 하고 스토어에 출시하기 위해선...IOS도 생각해야하니...)

 

IL2CPP는 AOT빌드 방식을 사용
Mono는 JIT빌드 방식을 사용

*AOT (Ahead-of-Time)
프로그램 실행 전에 컴파일을 미리 수행하여 기계어로 변환하는 방식
*JIT (Just-In-Time)
프로그램 실행 시점에 바이트코드를 기계어로 번역하여 실행하는 방식

profile

내가 일하며 알게 된 프로그래밍

@CtrlVGames