Unity Runtime
유니티의 멀티플랫폼 아키텍쳐?
메모리영역
Native영역(렌더링, 피직스 등등)
- 얘는 성능에 많은 영향을 미치므로 VM없이 동작.
Managed영역(C#스크립트)
- 이 녀석이 mono가 관리함.
- 여기서 Native영역의 메모리를 참조하면 Wrapper객체가 생성되는 비효율적인 구조
JIT
빌드타임
- C#스크립트 -> IL코드변환
런타임
- IL코드를 Mono에서 해석후 동작할 플랫폼에 따라 기계어로 번역
- 유니티 구버전들은 런타임 컴파일이 최적화가 잘 안되어서 성능상 이슈가 많았음. 또한 IL코드가 보안이 너무 취약해서 각종 디컴파일툴로 손쉽게 C#스크립트로 변환되어 조작할 수도 있었음……
- 유니티에선 Mono버전업은 계속 진행하는데 문제는 GC.
- 최신 Mono는 Sgen GC 사용, 그러나 어떠한 이유인지 몰라도 계속 Boehm GC를 사용.
- BoehmGC는 세대별 가비지 컬렉터가 아닌 마크앤스윕방식이다. Sweep시에 프로그램이 멈출 확률이 높은편..
- 2018.3부터는 Roslyn사용. 최신 닷넷프레임워크를 지원함.
AOT
빌드타임
- C#스크립트 -> IL코드변환 -> CPP코드변환
- 빌드시간이 오래걸림..
런타임
- 대부분의 기기는 CPP컴파일이 가능하므로 VM없이 바로 기계어로 동작.
- Vm없이 동작해서 최적화되었다고 생각하면 오산….
- 버그가 많음
- 이것땜에 C# 스크립팅시 제약이 있음.
- 이 Extension은 필수
- AOT컴파일 시 문제되는 코드를 잡아준다.