一種編譯技術。
優點:
- 性能優化:IL2CPP生成C++代碼后由本地編譯器優化,一般在CPU性能和GC方面都優于Mono。特別在移動端或主機平臺,性能差距更加明顯。
- 跨平臺支持:Unity作為跨平臺引擎,IL2CPP是支持iOS、Android、PS5、Switch等平臺的關鍵技術之一,Mono對部分平臺支持較弱。
- 安全性增強:IL2CPP會生成二進制,相比于.NET/Mono的中間語言IL更難反編譯,這提高了安全性。
- 完全AOT編譯:IL2CPP是強制的,同時AOT編譯也減少了運行時開銷,(iOS平臺不允許JIT編譯,而Unity也沒有使用AOT Mono,因此在Unity針對iOS的發布是強制使用IL2CPP的)。
- 內存管理改進:IL2CPP使用Unity自帶的GC實現(基于Boehm或incremental GC),比Mono內建GC表現更好。
- 64位支持:IL2CPP支持x64和ARM64,這對于Google Play要求的安卓必須是64位是關鍵。
- 現代C++編譯器優化:Clang/GCC/MSVC等編譯器可以根據平臺優化C++代碼,使生成的二進制更加高效。
- 可預測的性能:AOT的編譯方式使游戲的運行過程更加可預測,減少了因JIT帶來的運行開銷和卡頓風險。
- 通用基礎設施:IL2CPP是Unity支持跨平臺的核心基礎。
- 現代語言特性支持:IL2CPP不限制C#特性,關鍵看Unity支持的C#編譯器版本。
缺點:
- 編譯時間:特別是Android/iOS的打包,IL2CPP構建比Mono慢得更多,需要使用Xcode/NDK等額外工具鏈。
- 包體積變大:IL2CPP的AOT生成很多函數模板和綁定代碼,最終生成的包會比Mono大幾MB。
- 調試困難:IL2CPP會把C#代碼轉成C++,再編譯成二進制,調試時無法逐行查看C#源碼,只能通過符號表或日志分析,不如Mono那么直觀。
- 不支持反射場景中的泛型動態創建:IL2CPP需要靜態生成代碼,對于一些動態構造的泛型,需要手動保留或者指定link.xml。
IL2CPP構建Unity項目流程:C#源碼 --> 用C#編譯器編譯成中間語言.NET IL --> IL2CPP工具鏈將IL轉換為C++代碼 --> 使用平臺本地的C++編譯器(如Clang、GCC、MSVC)將C++編譯為機器碼 --> 生成原生可執行文件(.exe、.apk、.ipa、.so、.wasm)
IL2CPP打包后的結果是:
原生機器碼、
沒有任何IL存在于最終構建產物中、
不依賴任何虛擬機(不像Mono要打包Mono Runtime)、
也不會運行.NET字節碼或解釋執行
IL2CPP運行時的執行方式:
運行原生代碼(即機器碼),并且是完全的AOT編譯、無JIT,無IL,無虛擬機,無解釋器。