Unity 내일배움캠프 TIL 1117 | IL2CPP | JIT | Mono | Generic Sharing

cheeseonrose·2023년 11월 18일
0

Unity 내일배움캠프

목록 보기
81/89
post-thumbnail

[유니티 TIPS] 알고 있으면 쓸데 있는 IL2CPP, Mono, AOT, JIT 개념 파헤치기

💡 IL2CPP

🌰 C++

  • 객체 지향 (Class가 존재)
  • 메모리 관리를 직접 해줘야 함
  • Unity 엔진 내부는 C++로 되어 있음
    • 유저에게 노출되는 API만 C#



🥕 C#

  • C++에 의해 생산성이 좋음
    → 가비지 컬렉터가 메모리를 자동으로 관리
  • C++에 비해서는 성능 저하가 있긴 하지만, 메모리 관리로 인한 이점이 매우 큼



🌽 Mono

  • .NET 프레임워크에 대응하기 위해 만들어짐
  • 멀티 플랫폼에 대응하여 C#을 돌릴 수 있는 프로그램
  • JIT 컴파일이라는 기술을 사용하여 런타임 시 코드를 컴파일



🥜 JIT

  • Just In Time
  • 그때그때 필요할 때 컴파일
  • IL은 사람이 읽을 수 있는 중간 형태의 언어
  • 인터프리터와는 다른 개념
  • 중간 형태의 .NET Assembly(중간 형태)를 가지고 타겟 디바이스에 맞게 컴파일
  • 유니티 에디터는 Mono(JIT) 방식 사용



🥔 IL2CPP

  • Mono 백엔드의 대안
  • IL(Intermediate Language, .NET Assembly)을 CPP로 변환해주는 것
  • 변환한 C++ 코드를 사용하여 선택한 플랫폼용 네이티브 바이너리 파일(.exe, .apk, .xap 등)을 생성
  • IL2CPP를 통해 유저 코드도 C++로 돌릴 수 있음
    → 전반적인 성능 향상



🍆 AOT

  • 네이티브 바이너리를 빌드할 때 특히 타겟 플랫폼에 대해 코드를 컴파일하는 방식
  • IL2CPP로 빌드하게 되면 미리 컴파일 된 AOT(Ahead Of Time) 방식으로 돌아가게 됨
    → 개발할 때는 JIT, 빌드할 때는 AOT 사용



🍅 Generic Sharing

  • Generic 함수를 처리할 때 많은 에러 사항 들이 있음

  • C++에서의 Generic → template

    template <typename T>
    T minimum(const T& lhs, const T& rhs)
    {
    	return lhs < rhs ? lhs : rhs;
    }
    
    ...
    
    int a = 1;
    int b = 2;
    itn i = minimum<int>(a, b);
    
    ...
    
    float a = 1;
    float b = 2;
    float i = minimum<float>(a, b);
    • 위와 같이 int와 float형으로 사용하게 되면, 컴파일러는 두 가지 버전으로 함수를 따로 만들게 됨

  • 비슷해 보이는데 문제가 생기는 이유
    → call by value vs call by reference
    • call by value : 데이터를 복제해서 넘기는 것
    • call by reference : 데이터의 위치 정보를 넘기는 것
Struct A {
	int a, b, c, d, e, f;
}
  • Call by Value
    → 24byte (4byte * 6)

    A a;
    func(a);
  • Call by Reference

    • C의 포인터
      → 주소 값 8byte
    A* a;
    func (a);
  • C++의 Reference
    → 주소 값 8byte

    A a;
    func(&a);
  • C#에서는 Value와 Reference type을 알아서 정의해줌

    • Value type : struct, int, char, bool …
    • Reference type : Class, string ,array …

  • Reference type의 경우 Generic을 하나 만들어서 내부적으로 공유 가능
    Generic Sharing
  • C#은 JIT 방식이기 때문에 기본만 만들어 놓으면 나머지는 그때 그때 만들어서 사용하게 됨
  • C++로 변환하게 되면 미리 만들어야 하므로 코드가 길어지게 됨
    → Generic을 많이 사용할수록 IL2CPP 컴파일 과정이 오래 걸리게 됨
  • Project Settings - Player - IL2CPP Code Generation
    • Faster runtime : 기존 방식. Reference type은 Generic Sharing 사용. Value type은 Generic 코드 확장. 알 수 없는 Value type Generic 발견 시 공유 코드 사용
    • Faster (smaller) builds : Value type Generic도 항상 코드 공유 사용
      → 빌드 시간 및 사이즈 감소
      → 런타임 성능은 떨어지게 됨
    • 개발할 때는 Faster builds를 사용하더라도 최종 릴리즈는 Faster runtime 사용 권장



출처 - Unity Documentation Mono 개요
출처 - Unity Documentation IL2CPP 개요



ㄲ ㅡ ㅅ !

0개의 댓글