初识IL2CPP
在Unity中進(jìn)行打包時(shí),有兩種打包方式選擇:Mono和IL2CPP
Mono和IL2Cpp是Unity的腳本后處理方式,通過(guò)腳本后處理實(shí)現(xiàn)Unity的跨平臺(tái)
1.Mono
(1). Mono組成組件:
C#編輯器,CLI虛擬機(jī),以及核心類別程序庫(kù)
(2).跨平臺(tái)過(guò)程
Mono通過(guò)C#編輯器把腳本打包成中間語(yǔ)言(IL)IL所在的文件就是.dll后綴的文件,
然后和其他dll文件一起在Mono虛擬機(jī)(MonoVM)中運(yùn)行
在不同的平臺(tái)上MonoVM將IL翻譯成不同的平臺(tái)語(yǔ)言
(3).MonoVM運(yùn)行IL的3中方式:
1.JIT(just in time): 即時(shí)編譯
程序運(yùn)行過(guò)程中將IL的byte code(字節(jié)碼)轉(zhuǎn)譯為目標(biāo)平臺(tái)的原生碼
即生成新的代碼又運(yùn)行新代碼,其實(shí)就是將對(duì)應(yīng)的機(jī)器碼映射到內(nèi)存空間中,此時(shí)就需要對(duì)內(nèi)存空間的讀寫權(quán)限。
而ios封了內(nèi)存的可執(zhí)行權(quán)限,所以ios不能使用JIT的方式
2.AOT(Ahead of time):提前編譯
程序運(yùn)行前將.exe/.dll文件中的IL的byte code(字節(jié)碼)部分轉(zhuǎn)譯為目標(biāo)平臺(tái)的原生碼并且儲(chǔ)存起來(lái) 程序運(yùn)行過(guò)程中仍有一部分代碼通過(guò)JIT即時(shí)編譯
3.Full-AOT(Full ahead of time):完全靜態(tài)編譯
程序運(yùn)行前,將所有源碼編譯成目標(biāo)平臺(tái)的原生碼
其中:android 使用JIT的方式 IOS只支持Full-AOT的方式
圖解:
2.IL2Cpp
(1).IL2Cpp的組成部分:
AOT編譯器(il2cpp.exe),運(yùn)行時(shí)庫(kù)
AOT編譯器:把IL轉(zhuǎn)換成CPP文件
運(yùn)行時(shí)庫(kù):GC等
(2).跨平臺(tái)過(guò)程:
IL2Cpp通過(guò)AOT編輯器,把IL語(yǔ)言轉(zhuǎn)換成c++語(yǔ)言,然后通過(guò)運(yùn)行機(jī)器平臺(tái)的編譯器 編譯成對(duì)應(yīng)平臺(tái)能執(zhí)行的原生匯編代碼,再使用IL2Cpp VM 運(yùn)行
圖解:
?平臺(tái)支持:Android平臺(tái)支持Mono和IL2CPP的所有編譯方式,而IOS只支持Mono的Full AOT模式和IL2CPP 。
如果有不對(duì)的地方希望能指出來(lái) 感激不盡。另外,不熟悉的代碼一定要寫一下加深記憶 只用看的記不了太久。
總結(jié)
- 上一篇: 快速AI自动抠图,小花儿人工智能
- 下一篇: 笔记---domoticz docker