Steam API인 Facepunch.Steamworks를 보다가
Unity IL2CPP 를 지원한다고 해서
IL2CPP가 뭔지 궁금해 찾아보았다
IL2CPP
- C++로 변환하는 중간 언어
- Unity에서 개발한 스크립팅 백엔드
- 여러 플랫폼용 프로젝트를 빌드할 때 Mono대신 사용할 수 있음
IL2CPP를 사용하여 프로젝트를 빌드하면,
1. Unity가 스크립트와 어셈블리의 IL 코드를 C++ 코드로 변환
2. 선택한 플랫폼에 적합한 네이티브 바이너리 파일(exe, zpk, xap..)을 만듦
- IL2CPP는 Unity 프로젝트의 성능, 보안 및 플랫폼 호환성을 개선하는 등의 용도로 사용됨
https://blog.unity.com/technology/an-introduction-to-ilcpp-internals
2015년에 게시된 글이지만, IL2CPP에 대한 소개글을 보면 두 가지로 말할 수 있다고 함
- AOT(Ahead-of-Time) 컴파일러
- 가상 머신을 지원하는 런타임 라이브러리
AOT 컴파일러
(진짜 있음)
런타임 라이브러리
IL2CPP 작동 방식
- Unity 스크립팅 API 코드를 일반 .NET DLL(관리되는 어셈블리)로 컴파일
- 관리되는 '바이트코드 스트리핑'을 적용 (빌드된 게임의 크기를 크게 줄여줌 !)
- 모든 관리되는 어셈블리를 표준 C++ 코드로 전환
- 생성된 C++ 코드와 IL2CPP의 런타임 부분을 네이티브 플랫폼 컴파일러로 컴파일
- 대상 플랫폼에 따라 실행 가능한 파일이나 DLL에 코드를 연결
(참고: https://docs.unity3d.com/kr/2019.4/Manual/IL2CPP-HowItWorks.html)
위 그림을 보면 더 잘 이해가 된다
C#으로 작성된 게임 로직을 표준 C++코드로 전환한다
바이트코드 스트리핑
- 사용되지 않는 코드가 관리되는 어셈블리(DLL)에서 제거됨 (그래서 빌드된 게임의 크기를 크게 줄여주나보다)
- 코드를 난독화하지 않고 사용되는 코드를 어떤 식으로는 변경하지 않음
- 다음 순서로 진행됨
- 루트 어셈블리 정의
- 정적 코드 분석
- 해당 루트 어셈블리에서 사용되는 다른 관리되는 코드를 확인
(참고: https://docs.unity3d.com/kr/2019.1/Manual/IL2CPP-BytecodeStripping.html)