자가라 노트

Unity

[Unity] 컴파일 방식 2) IL2CPP

자가라o 2021. 10. 10. 05:55

IL2CPP는 Unity에서 개발한 (스크립팅 백엔드)AOT 컴파일러로, <<IL to CPP>> Unity가 스크립트와 어셈블리의 IL코드C++ 코드로 변환시켜 선택한 플랫폼에 적합한 네이트브 바이너리 파일로 만듭니다. IL2CPP는 Unity 프로젝트의 성능, 보안 및 플랫폼 호환성을 개선하는 등의 용도로 사용됩니다.

보안관련하여 IL2CPP로 빌드하게 되면 코드가 난독화되어 디컴파일시 코드가 바로 노출되지 않습니다. (최소한의 보안)

 

- 유니티 매뉴얼

 

Mono의 문제점

  • C# runtime performance가 C/C++에 비해 여전히 느리다.
  • 최신 버전의 .NET언어를 Mono에서 지원하기 힘들다.
  • 다양한 플랫폼 아키텍처에 맞추기위한 포팅, 유지보수등의 작업에 너무 많은 노력이 든다.
  • 실행 중 GC가 멈출 수도 있다.
  • IOS 앱스토어에 APK 등록시 armv7과 armv8 두 버전을 모두 등록해야 하는데(정책) Mono는 armv8(arm64)를 지원하지 못한다.
  • IOS가 JIT(Just in time) 컴파일 방식을 지원하지 않음에 따라 AOT(Ahead of time) 컴파일 방식을 사용하는 IL2CPP가 대두되었다.

 


 

<IL 코드>

C# 코드를 빌드하면 MSIL이라는 중간코드(Intermediate Language)를 만들어 냅니다. 프로그램 실행시 이 IL 코드는 JIT Compiler에 의해 컴파일 되어 Native코드로 변경됩니다. IL 방식의 가장 큰 장점은 실행 머신 환경에 관계없이 동일 코드를 실행 할 수 있다는 것입니다. 하지만 실행시 IL코드를 컴파일 해야하기 때문에 속도가 저하의 원인이 된다는 단점도 있습니다. .NET에서는 이러한 문제를 해결하기 위해 프로그램 실행시 전체 IL코드를 컴파일하는 것이 아니라 호출되는 메서드단위로 컴파일을 실행합니다. 따라서 어떤 메서드가 한번도 호출되지 않는다면 해당 메서드는 Native 코드로 변경되지 않습니다.

 

MSIL  :  MS에서 나온 IL

CIL    :  Common Intermediate Language

 


 

<IL2CPP 작동방식>

 

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

 

 

아~ 완벽히 이해못했어!

- 작동방식 문서


 

<IL2CPP 빌드 시간 최적화>

 

① 증분 빌드 사용

  • 증분 빌드를 사용하면 C++ 컴파일러가 마지막 빌드 후 변경된 파일만 다시 컴파일한다고 합니다.
  • 사용하려면 (대상 디렉토리를 삭제하지 않고) 프로젝트를 이전 빌드 위치에 빌드합니다.

② 멀웨어 차단 소프트웨어 검사에서 프로젝트 및 대상 빌드 폴더 제외

  • Unity Technologies의 테스트 결과,
  • Windows 10에서 Windows Defender를 비활성화 후 빌드시간이 50-66% 단축됬다고 합니다.

③ SSD에 프로젝트와 대상 빌드 폴더 저장

  • 스토리지 디바이스가 더 빠르면 처리 속도가 빨라집니다.

 

- 빌드 최적화 문서

 


 

<추가>

 

http://linforum.kr/bbs/board.php?bo_table=android&wr_id=4&sca=%EA%B0%95%EC%A2%8C&page=2