유니티로 게임을 만들 때 , 개발자는 C#으로 프로그래밍을 합니다 C#은 컴파일러형 언어이기 떄문에 유니티에서 게임을 개발 할 때 수시로 컴파일(빌드) 가 실행 됩니다. C#은 전통적인 C언어 등과 다른점은 컴파일 하면 기계에서 단독으로 실행되는 기계어가 아니라 NET의 중간언어 (Intermediate Language 즉 IL) 로 컴파일 된다는 점입니다.
IL로 변환된 실행 코드는 단독으로 실행할 수 없기 떄문에 .NET Framework의 런타임을 이용하여 순차적으로 기계어로 변환하면서 실행 됩니다.
IL 을 끼워 넣는 이유는 일단 기계어로 변환하면 단일 플랫폼에서만 실행할 수 있는 바 이너리가 되기 때문이다. IL 이라면 어떤 플랫폼에서든 해당 플랫폼에 맞는 런타임만 준비 하면 동작하게 되므로 플랫폼마다 바이너리를 준비할 필요가 없어집니다. 따라서 Unity 의 기본 원칙은 소스코드를 컴파일하여 얻은 IL 을 그대로 각 환경에 맞는 런타임으로 실 행하는 것으로 멀티플랫폼을 구현하고 있습니다.
IL 코드를 확인해 보자
평소에는 잘 볼 수 없는 IL 코드는 메모리 확보, 실행 속도 등 성능을 고려하는 데 있어 매우 중요한 부분입니다. 예를 들어, 배열과 List 는 같은 foreach 루프에 서도서로다른IL코드가출력되며,배열이더성능이좋은코드가됩니다. 또한 의도하지 않은 숨겨진 힙 할당을 발견할 수도 있습니다. 이러한 C#과 IL 코드의 대응 감각을 익히기 위해 평소에 자신이 작성한 C# 코드의 IL 변환 결과를 확인해 보는 것을 추천합니다. Visual Studio 나 Rider 와 같은 IDE 에서 IL 코드를 열람 할 수 있지만, IL 코드 자체는 어셈블리라는 저급 언어이기 때문에 이해하기 어려 운 언어입니다. 그런 경우에는 SharpLab *2이라는 웹 서비스를 이용하면 C# -> IL -> C#과 IL 을 역변환한 코드를 확인할 수 있어 이해하기 쉽다. 이 책의 후반부 제 10 장「Tuning Practice - Script (C#)」에서 실제 변환 예제를 소개합니다.
IL2CPP
앞서 언급했듯이 유니티는 기본적으로 C#을 IL 코드로 컴파일하여 런타임에 실행하는데, 2015 년경부터 일부 환경에서 문제가 발생하기 시작했다. 바로 iOS 나 안드로이드에서 동작하는 앱의 64 비트 지원입니다. C#은 IL 코드를 실행하기 위해 각각의 환경에서 동 작할 수 있는 런타임이 필요한 것은 앞서 언급했듯이 사실 그전까지의 유니티는 오랜 기 간 .NET Framework 의 OSS 구현인 Mono 를 포크하여 Unity 자체적으로 수정하여 사 용하고 있었습니다. 즉, Unity 가 64bit 를 지원하기 위해서는 포크한 Mono 를 64bit 로 바 꿔야 했습니다. 물론 이는 엄청난 노력이 필요하기 때문에 유니티는 대신 IL2CPP 라는 기술을 개발하여 이 난제를 해결했습니다.
IL2CPP 는 이름 그대로 IL to CPP 를 의미하며, IL 코드를 C++ 코드로 변환하는 기술 이다. C++ 는 어떤 개발 환경에서도 네이티브 지원되는 범용성이 높은 언어이기 때문에 C++ 코드로 출력하면 각 개발 툴체인에서 기계어로 컴파일할 수 있다. 따라서 64bit 대응은 툴체인의 몫이 되므로 Unity 측에서 대응할 필요가 없습니다. 또한 C#과 달리 빌드 시 점에 기계어로 컴파일되기 때문에 런타임에 기계어로 변환할 필요가 없어져 성능이 향상 되는 이점도 있습니다.
C++ 코드는 일반적으로 빌드 시간이 오래 걸린다는 단점이 있지만, 64 비트 대응과 성 능을 한 번에 해결할 수 있는 IL2CPP 라는 기술은 Unity 의 핵심이 되었습니다
'Unity' 카테고리의 다른 글
FireBase Sdk 10.2 업데이트때 발생하는 문제 (0) | 2023.07.27 |
---|---|
프로그래머를 위한 워크플로 속도 향상 팁 (0) | 2023.07.26 |
Unity Frame Debugger (0) | 2023.07.25 |
맥 버전을 12.3으로 업데이트 하고 유니티 플레이가 안되는 경우 (0) | 2023.06.30 |
sdk가 정상적으로 적용했는데 호환이 안되거나 못찾는다면 proguard 등록을 확인하자 (0) | 2023.06.28 |