[Unity] IL2CPP가 뭐지

박민주·2022년 1월 14일
3

Unity

목록 보기
5/40
post-thumbnail

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 컴파일러


(진짜 있음)

런타임 라이브러리

  • libil2cpp
  • 핵심은 가비지 콜렉터

IL2CPP 작동 방식

  1. Unity 스크립팅 API 코드를 일반 .NET DLL(관리되는 어셈블리)로 컴파일
  2. 관리되는 '바이트코드 스트리핑'을 적용 (빌드된 게임의 크기를 크게 줄여줌 !)
  3. 모든 관리되는 어셈블리를 표준 C++ 코드로 전환
  4. 생성된 C++ 코드와 IL2CPP의 런타임 부분을 네이티브 플랫폼 컴파일러로 컴파일
  5. 대상 플랫폼에 따라 실행 가능한 파일이나 DLL에 코드를 연결


(참고: https://docs.unity3d.com/kr/2019.4/Manual/IL2CPP-HowItWorks.html)

위 그림을 보면 더 잘 이해가 된다
C#으로 작성된 게임 로직을 표준 C++코드로 전환한다

바이트코드 스트리핑

  • 사용되지 않는 코드가 관리되는 어셈블리(DLL)에서 제거됨 (그래서 빌드된 게임의 크기를 크게 줄여주나보다)
  • 코드를 난독화하지 않고 사용되는 코드를 어떤 식으로는 변경하지 않음
  • 다음 순서로 진행됨
  1. 루트 어셈블리 정의
  2. 정적 코드 분석
  3. 해당 루트 어셈블리에서 사용되는 다른 관리되는 코드를 확인
    (참고: https://docs.unity3d.com/kr/2019.1/Manual/IL2CPP-BytecodeStripping.html)
profile
Game Programmer

0개의 댓글