본문 바로가기

C#/Unity

[Unity] 왜 만들었는지 모를 IL2CPP

IL2CPP는 유니티에서 발표한 AOT 컴파일러이다.


특이한점이 있다면, 인풋은 이미 빌드된 IL 코드 (DLL)이며, 아웃풋은 C++ 코드이다.

그러니까 이미 빌드된 바이너리를 다시 뜯어서 컴파일 가능한 C++ 소스코드로 만들어낸다는건데, 어떻게보면 AOT가이나리 디컴파일로 생각할수도 있겠다.



유니티가 주장하는 IL2CPP의 장점

- 퍼포먼스 : c++로 변환되서 네이티브 어셈블리로 실행되기 때문에 퍼포먼스 향상이 있다고 한다. 근데 처음부터 c++로 짜여진 코드도 아니고, IL을 c++ 코드로 변환한것이기때문에 최종 결과물인 c++ 코드에 .Net VM 호환성을 위한 코드들이 상당히 많이 들어간다. 어차피 Mono도 JIT이니, AOT니 전부 지원하는데 큰 효과가 있느지는 잘 모르겠다. 유니티측 벤치는 IL2CPP를 적용하면 빨라진다고 주장하지만 다른 유저가 측정한 벤치는 오히려 느려진다는 벤치도 있고, 스택오버플로우에는 IL2CPP로 변경했더니 게임 프레임이 심각하게 떨어졌다는 질문도 있는 상황이다. 애초에 IL2CPP 퍼포먼스 관련 글이 어엄청나게적음.

- 포터블(?) : 자바가 vm이 있는 구조를 내세우면서 c++과 비교해서 내세운 장점도 이거다. 근데 유니티는 반대의 주장을 하고있다. 아마도 플랫폼(OS)이 아니라 아키텍쳐에 대해서 이식성이 좋다는 소리를 하고싶다는것 같은데 자기들이 모든 아키텍쳐에 대해서 모노를 지원할 역량이 안되니 그냥 c++ 컴파일러에게 일을 미루겠다는뜻으로밖에 안보인다.

    


중간 언어와 비교해서의 단점

- 컴파일 시간이 길어진다. : 유니티에서 xcode 프로젝트로 출력하는 시간도 어마어마하고 / 엑스코드에서 앱으로 빌드하는시간도 어마어마해진다. C#의 장점이 컴파일이 빠르다는건데 유니티는 진짜 C#의 장점만 골라서 다버리는 삽질에는 따라올수없는 강자다.

- 버그가 너무 많이생긴다. : IL2CPP는 기존 코드에 대해서 투명성 있게 작동해야 하는게 정상이지만, 그런것치고는 버그가 어마어마하다. 나도 몇가지를 본적이 있는데 주로 리플렉션을 사용하는 JSON 라이브러리들에서 발생한다. 일단 이쪽에서 버그가 발생하면 뭐 손 쓸 수 있는 방도가 없다. 그냥 유니티에 버그리포트하고 어마어마하게 느린 응답을 기다리는것밖에는.
실제로 유니티 릴리즈 노트에 올라오는 패치노트중 IL2CPP가 차지하는 부분은 어마어마하다.

- .Net의 풀스펙을 사용할 수 없다. : 사실 이부분은 유니티가 모노 2.0을 사용하는 시점에서 기대도 안하기때문에 별로 길게 안씀



그럼 왜 만들었나

인터넷에 올라오는 글 중에는 종종 iOS 64비트 지원을 위해서 내놓은 솔루션이라고 하는 글이 있는데 그건 그냥 옛날부터  IL2CPP를 개발하고 있었지만, 마침 iOS 64비트 지원 의무화 이슈가 터지면서 덜만들어졌음에도 불구하고 iOS에 베타성격으로 먼저 풀어버린것 같다. 
실제로 IL2CPP는 iOS뿐만 아니라 지금 안드로이드나 윈도 스토어버전까지도 하나하나씩 나오고있는데, 이걸 봐서는 모노 런타임을 완전히 대체할 큰그림을 그리고있는것으로 생각된다. 지네도 2010년버전인 모노2.0들고 타이젠이니 윈폰이니 지원하기 힘드니까 그냥 일을 다 c++ 컴파일러에게 미뤄버리려는 속셈으로 생각되고 퍼포먼스는 그냥 거기서 딸려 나오는 보너스라고 생각.


* 닷넷도 그렇지만 프레임워크랑 런타임은 별개다. 모노 프레임워크를 교체한다는 뜻은 아님