unity中的AOT、JIT、IL2CPP、Mono

一、JIT、AOT是什麼

JIT,即Just-in-time,動態(即時)編譯,邊運行邊編譯;AOT,Ahead Of Time,指運行前編譯,是兩種程序的編譯方式

二、優劣

JIT優點:

①可以根據當前硬件情況實時編譯生成最優機器指令(ps. AOT也可以做到,在用戶使用是使用字節碼根據機器情況在做一次編譯)
②可以根據當前程序的運行情況生成最優的機器指令序列
③當程序需要支持動態鏈接時,只能使用JIT
④可以根據進程中內存的實際情況調整代碼,使內存能夠更充分的利用

JIT缺點:

①編譯需要佔用運行時資源,會導致進程卡頓
②由於編譯時間需要佔用運行時間,對於某些代碼的編譯優化不能完全支持,需要在程序流暢和編譯時間之間做權衡
③在編譯準備和識別頻繁使用的方法需要佔用時間,使得初始編譯不能達到最高性能

AOT優點:

①在程序運行前編譯,可以避免在運行時的編譯性能消耗和內存消耗
②可以在程序運行初期就達到最高性能
③可以顯著的加快程序的啓動

AOT缺點:

①在程序運行前編譯會使程序安裝的時間增加
②犧牲Java的一致性
③將提前編譯的內容保存會佔用更多的外

三、與unity關聯

1、JIT & Mono編譯

Unity的跨平臺技術是通過一個Mono虛擬機實現的。而這個虛擬機更新太慢,不能很好地適應衆多的平臺。
Mono編譯流程

Android下會生成:
\assets\bin\Data\Managed\ Assembly-CSharp.dll (遊戲的控制邏輯,運行時調用)

\lib\armeabi-v7a\ libmono.so, libmain.so, libunity.so (libmono.so會完成mono VM的功能)

2、AOT & IL2CPP編譯

unity公司就自行研發了IL2cpp,把本來應該再mono的虛擬機上跑的中間代碼轉換成cpp代碼,這樣再把生成的cpp代碼,利用c++的跨平臺特性,
在各個平臺上通過對各平臺都有良好優化的native c++編譯器編譯,以獲得更高的效率和更好的兼容性。
什麼是native compiler?什麼是cross compiler?
ILL2CPP編譯流程

Android下會生成:
\assets\bin\Data\Managed\ Assembly-CSharp.dll 一般不打包進apk(遊戲的控制邏輯,只作爲中間文件存放,運行時不會調用)

\lib\armeabi-v7a\ libil2cpp.so, libmain.so, libunity.so (libil2cpp.so中包含了遊戲控制的native code,和IL2CPP VM功能)

3、IL2CPP相比Mono的優勢

①Mono VM在各個平臺移植,維護非常耗時,有時甚至不可能完成
②Mono版本授權受限
③提高運行效率
④有了IL2CPP,程序尺寸可以相對縮小,運行速度可以提高!
⑤使用了IL2CPP在堆內存分配方面和Mono 相比,Reserved Total 是可以下降的,而 Mono的 Reserved Total 只會上升不會下降。

相關鏈接:https://blog.csdn.net/h1130189083/article/details/78302502
相關鏈接:https://www.cnblogs.com/eniac1946/p/7417191.html
相關鏈接:https://zhuanlan.zhihu.com/p/19972689

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章