2022. 8. 9. 20:42ㆍTech/Unity
- 목차
서론
모바일 플랫폼이 64bit 아키텍처를 지원하면서, 이제는 Mono방식으로만 빌드할 수 없다고 합니다. 엔진에서 소스코드를 실행할 때는 Mono방식으로 진행되며, 빌드 시에는 32bit 아키텍처만 지원합니다. 이제는 .Net또한 크로스 플랫폼을 제공하며 Unity에서도 64bit 아키텍처를 지원하는 Mono 라이선스를 취득할 필요도 없기에 il2cpp이라는 빌드 시스템을 지원합니다. 이번 글에서는 il2cpp빌드 방식을 다뤄보려 합니다.
il2cpp의 의미
il2cpp이란 IL to cpp을 의미합니다. 즉, C#언어로 만들어진 코드를 C#컴파일러가 IL로(어셈블리) 만들어진 것을 Native에 호환성이 좋은 cpp 코드로 바꿔서 빌드해 주는 것을 의미합니다. iOS는 원래 cpp이 동작하고, Android의 경우에도 JNI를 통해 cpp이 동작할 수 있는 구조이기 때문에 가능합니다. 그렇다면 기존에 사용하던 Mono를 대체하여 굳이 cpp코드로 바꾸는 이유는 무엇일까요?
il2cpp인 이유
우선 기존 JIT컴파일 방식을 사용하는 Mono의 경우, IL을 런타임에 해석해서 실행하는 방식입니다. 이를 위해 생성된 IL코드를 열어보면, 편하다고는 할 수 없지만 읽지 못할 정도의 코드는 아닙니다.
빌드의 결과 위처럼 나오게 되면, 타인에게 코드를 노출 할 수 있는 보안상의 이슈가 있습니다. il2cpp은 위처럼 생성된 IL을 다시 한번 Stripped assemblies작업을 통해, 난독화된 cpp코드로 바꿔줍니다.
이렇게 cpp코드로 바뀜으로써 기존 Mono와는 다르게 JIT컴파일 방식이 아닌 AOT(Ahead-of-Time)컴파일방식으로 진행됩니다. 이는 플랫폼에 맞는 네이티브 바이너리(실행할 소스코드를 미리 빌드)를 제작하고, 이를 실행하는 방식입니다. 그렇기 때문에, JIT컴파일 방식의 Mono에 비하여 빌드 시간이 길고 실행 성능이 더욱 좋습니다. 엔진에서 실행(플레이)할 경우 빌드->실행을 거치기 때문에 Mono방식으로 실행됩니다.
보안상의 이유말고도 스크립팅 제약사항이 있습니다. 멀티 크로스 플랫폼을 제공하는 엔진의 특성상 플랫폼별 제약사항을 대응할 필요가 있습니다. 몇몇 플랫폼은 런타임 코드 실행을 지원하지 않기 때문에, JIT 방식을 사용할 수 없습니다.
자세한 사항은 Unity 스크립팅 제약사항 문서를 참고하면 좋습니다.
이처럼, 미리 실행될 소스코드를 만드는 방식이기 때문에 절약에도 이점이 있습니다. 사용되지 않는 코드는 Stripping 단계에서 제거되기 때문이죠. 이제 AOT방식의 il2cpp이 현재이자 미래가 아닐까 싶습니다.
마치며
모바일 양대산맥인 안드로이드, iOS에서도 il2cpp방식(AOT방식)으로 동작을 하다 보니, 64bit 아키텍처를 제공하기 위해서는 엔진에서도 il2cpp로 빌드를 해줘야 각 os에서 돌아가게 됩니다. 이제는 필수인 빌드 방식이겠습니다.
리소스 출처
[그림1] : Unity il2cpp 공식 설명 문서, https://docs.unity3d.com/kr/2019.4/Manual/IL2CPP-HowItWorks.html
[그림2~3] : Unity korea offical "[유니티 TIPS] 알고 있으면 쓸데 있는 IL2CPP, Mono, AOT, JIT 개념 파헤치기" 중
'Tech > Unity' 카테고리의 다른 글
[Unity]Unity의 예약 폴더(특수 폴더, Special folder names) (0) | 2023.03.12 |
---|---|
[Unity]Device simulator(디바이스 시뮬레이터) (0) | 2023.03.04 |
[Unity]Unity의 Mono (0) | 2022.08.09 |
[Unity]Addressable asset system 원격 환경 적용 법(+ 간단한 응용) (3) | 2022.06.12 |
[Unity]Addressable asset 기본 개념 (2) | 2022.06.12 |