본문 바로가기
Unity 게임 개발/Unity IL2CPP

유니티 성능향상 - IL2CPP 2: mono, JIT방식, IL이란?

by daisy0461 2022. 3. 31.

유니티 성능향상 - IL2CPP 1: C#과 C++의차이 - https://daisy0461.tistory.com/m/50

 

유니티 성능향상 - IL2CPP 1: C#과 C++의차이

유니티 성능 향상을 공부하다가 IL2CPP라는 것을 알게 되었다. 이 기능을 공부하기 위해 https://youtu.be/-9X965jXrn8 을 참고해서 블로그 글로 남긴다. 다들 알고 있겠지만 C#은 C++보다 느리다는 인식이

daisy0461.tistory.com

해당 글의 연장글이다.
동일하게 아래의 동영상을 참고해서 글을 남긴다.

https://youtu.be/-9X965jXrn8


이전글을 읽고 왔다면 C#은 .Net Framework에서 돌아간다. 근데 java나 ios같은 경우는 MS제품군이 아니기 때문에 .Net Framework가 돌아가지 않는다. 그럼 의문이 생긴다. 우리는 .Net Framework에서 돌아가는 C#을 통해 게임 개발을 하고 갸벌아 완료되었을 때 최종적으로는 안드로이드에서도 작동하고 아이폰에서도 작동한다. 이게 가능한 이유는 mono를 사용하기 때문이다.

Mono

이 mono같은 경우는 .Net Framework를 대응하기 위해 만들어진 것이다. 이 mono는 android, ios, PS, XBox등 여러가지 플랫폼, 즉 멀티 플랫폼을 대응해서 C#을 돌릴 수 있다. mono는 멀티플랫폼 Framework이다. 이 mono가 원래는 오픈소스로 시작했는데 MS가 가져갔다. 이후 계속 mono를 발전시키고 있다.

우리가 C#을 가지고 개발을 하고 C#을 최종적으로 띄우기 위해 mono라는 Framework를 사용한다. 이 mono를 통해 C#이 android에서도 돌아가고 아이폰등 여러가지 플랫폼에서 돌게된다.

C#에서 mono를 거쳐 멀티플랫폼까지 진행되는 과정을 설명하겠다.
C#에서 IL(Intermediate Language)라고 중간 언어로 변환을 한다. IL은 .Net Assembly라고 할 수 있다. IL이라는 중간언어 형태로 변환 후 IL을 mono를 통해 돌린다.

결국 우리가 코드를 C#으로 작성을 했고 빌드할 때 mono로 빌드를 하면 IL이 탑재된다. 그러면 mono가 런타임 상에서 파싱을 하면서 여러가지 플랫폼 요소로 돌릴 수 있게 된다.
이러한 방식을 JIT방식이라고 한다.(Just In Time의 줄임말이다.) JIT는 그때그때 필요할 때 컴파일한다는 개념이다. IL이라는 것 자체가 기계어가 아니라서 Low Level 또는 High Level도 아닌 중간 형태의 언어이다.
Low Level: Assembly,기계어 등 읽기 힘든 글
High Level: C#, java등 읽고 작성할 수 있는 언어
그렇다면 IL은 사람이 읽을 수도 있는 언어라는 의미이다.

JIT방식은 인터프리터랑 다른 방식이다. Python 같은 Script Language에서는 인터프리터라고 해서 유저 코드 자체를 실시간으로 파싱하면서 돌린다. 그렇기 때문에 굉장히 느린데 JIT방식은 중간 형태의 .Net Assembly를 가지고 Target device에 맞게 컴파일 하기 때문에 인터프리터보다 빠르다. 하지만 미리 컴파일 하는 방식보다는 느리다는 것을 맞는 이야기이다.