알고 있으면 쓸데 있는 IL2CPP, Mono,AOT,JIT 개념 파헤치기

 

https://youtu.be/-9X965jXrn8

 


유니티와 C#

유니티는 내부구조는 c++지만 사용자 API는 C#로 제공된다.

IL2CPP가 도입되면서 엔진을 포함한 유저 코드 부분도 C++로 돌릴 수 있어 게임 성능을 높일 수 있음

 

IL2CPP

 

C#

MS에서 .NET Framework 기반으로 돌아가는 C#을 만들었음

C#은 메모리관리(GC)를 알아서 해주기 때문에 개발이 편해 생산성 높아짐

그러나 Managed Memory를 사용하여 성능은 저하

 

Mono

JAVA, IOS는 MS제품이 아니라서 .NET Framework가 돌아가지 않지만 Mono를 사용해서 돌아가게 함.

Mono는 윈도우 이외의 멀티 플렛폼에서 .NET Framework가 동작하기 위해 만들어짐. 이후 MS에서 가져갔다고 함 (으른들의 사정)

 

IL

C#을 Mono로 띄우기 위해 IL(.NET Assembly)이라는 중간 언어로 돌리고 IL을 Mono상에서 돌림

 

JIT(Just-In-Time)

C# -> IL -> Mono -> 멀티 플랫폼으로 그때그때 필요할 때 컴파일한다.(완전 실시간은 아님)

JIT는 한 번 변환된 어셈블리로 타겟 디바이스에 맞게 컴파일해서 생 인터프리터보다는 빠르지만 미리 컴파일한 것보다는 느린 중간단계

* Lua, Python : 스크립트 랭기지는 인터프리터라 해서 유저 코드를 실시간으로 파싱해서 돌려서 느림

 

IL2CPP

IL을 CPP로 변환해주는 단계로 AOS(NDK), IOS에서 돌아갈 수 있다.

미리 컴파일해 놓은 AOT 방식으로 컴파일되어 성능 좋음.

 

 

유니티는 개발에는 생산성이 좋은 JIT방식을 사용하고, 최종빌드에는 성능에 좋은 AOT방식을 사용하는 방식이 가능하다고 한다

 

 

Generic Sharing

Generic

한번 작성한 것을 가지고 여러 타입으로 일반화하여 재사용할 수 있다. 코딩 시간을 단축할 수 있음.

C++ Template과 유사하나 C++은 컴파일러가 사용된 타입 버전의 코드들을 만들어냄(많이 사용하면 많이 만들어짐. 코드 사이즈 커짐)

 

call by value

함수를 호출할 때 인자의 값을 복제해서 넘겨줌

값이 복사되기 때문에 데이터의 크기만큼 복사가 이루어짐

 

call by reference

함수를 호출할 때 인자 데이터의 주소값을 넘겨줌.

값의 주소값을 받기 때문에 주소값의 크기만큼만 사용함

 

C#에서는 데이터의 타입에 따라 알아서 값타입과 참조타입을 골라 사용한다.

 

C#은 그때그때 컴파일하기 때문에 C++로 바꾸면 Generic을 C++의 Template의 코드 복사처럼 풀어야 한다.

 

IL2CPP Code Generation

Generic Sharing을 만들 때..

 

Fast Runtime

값타입은 복제하여 코드 사이즈가 늘어나는 기존 방식, 컴파일 오래 걸림 (최종빌드권장)

 

Faster (smaller) builds

값타입을 포인터를 사용하여 공유코드로 사용. 코드 사이즈는 작으나 런타임 성능이 떨어짐 (개발빌드권장)

 

 

 

728x90

'Program > Unity' 카테고리의 다른 글

UGUI 최적화 (작성중)  (0) 2023.03.22
직렬화 (Serialization)  (0) 2023.03.08
Unity  (0) 2022.09.19
나중에 활용  (0) 2022.08.04
Quaternion  (0) 2022.07.14

+ Recent posts