最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

熱更新:為什么這么NB?huatuo革命Unity熱更新

2022-12-01 21:06 作者:游戲開發(fā)RAIN  | 我要投稿

huatuo(華佗)熱更新解決方案火爆了unity開發(fā)圈,起初我覺得熱更新嘛,不就是內(nèi)置一個腳本解釋器+腳本語言開發(fā),如xLua, ILRuntime, puerts。Huatuo又能玩出什么花樣,憑什么會這么NB,引起了那么多程序員的關(guān)注與稱贊呢?帶著這些問題我詳細的看了huatuo的資料,閱讀了示例項目+huatuo源碼,我也瞬間成了一位”佗粉”。接下來更新一系列的文字教程+視頻教程來詳細的講解huatuo熱更新。

?

要掌握huatuo熱更新,我們先搞懂一些底層的概念與原理,搞懂這些是掌握huatuo的關(guān)鍵。本節(jié)我將從以下3個方面來詳細的講解huatuo熱更新解決方案:

(1) il2cpp是什么? AOT是什么?

(2) huatuo熱更新的技術(shù)原理;

(3) huatuo熱更方案的革命性優(yōu)勢;

?

il2cpp是什么? AOT是什么?

?

在說il2cpp之前,先說說mono, 在mono之前,C#雖然很好,但是只在windows家族平臺上使用,就這點C#與Java就無法比。于是微軟公司向ECMA申請將C#作為一種標準。在2001年12月,ECMA發(fā)布了ECMA-334 C#語言規(guī)范。C#在2003年成為一個ISO標準(ISO/IEC 23270)。意味著只要你遵守CLI(Common Language Infrastructure),第三方可以將任何一種語言實現(xiàn)到.Net平臺之上。有了CLI的標準,Mono就誕生了, 該項目的目標是創(chuàng)建一系列符合ECMA標準(Ecma-334和Ecma-335)的.NET工具,包括C#編譯器和通用語言架構(gòu)。與微軟的.NET Framework(共通語言運行平臺)不同,Mono項目不僅可以運行于Windows系統(tǒng)上,還可以運行于Linux,F(xiàn)reeBSD,Unix,OS X和Solaris,甚至一些游戲平臺,例如:Playstation 3,Wii或XBox 360之上。Mono使得C#這門語言相對于微軟的.Net有了很好的跨平臺能力。

.Net Framework運行時庫Mono使用自己的Mono VM。 加上C#本身快速友好的開發(fā)能力,最終使得Unity團隊在創(chuàng)建之初就決定將Mono,C#作為其核心。

接下來引出重要的一個概念”IL“。IL的全稱是 Intermediate Language,很多時候還會看到CIL(Common Intermediate Language,特指在.Net平臺下的IL標準)。在Unity中,IL和CIL表示的是同一個東西:它是一種屬于通用語言架構(gòu)和.NET框架的低階(lowest-level)的編程語言。將.NET框架的語言編譯成CIL,然后匯編成字節(jié)碼。CIL類似一個面向?qū)ο蟮膮R編語言,并且它是完全基于堆棧的,它運行在.net虛擬機上。

?

CLI標準出來后,又出現(xiàn)一個項目:IL2CPP,把IL轉(zhuǎn)成靜態(tài)的c++代碼文件,由本地編譯器編譯成二進制機器指令。由于C#這樣的高級語言都有垃圾回收等機制,所以IL轉(zhuǎn)成靜態(tài)的c++代碼后,還有一個IL2CPP的runtime(IL2CPP VM)用來支撐這些高級語言特性。通過IL2CPP技術(shù),我們IL代碼轉(zhuǎn)成本地機器碼,獲得很好的性能。Unity也采用了這個技術(shù),用unity開發(fā)的C#代碼可以通過.net 轉(zhuǎn)成IL代碼,再通過IL2CPP轉(zhuǎn)成靜態(tài)c++文件,然后編譯成本地機器碼運行。為什么Unity采用IL2CPP呢?主要原因有:

a:Mono VM在各個平臺移植,維護非常耗時,有時甚至不可能完成。

b: Mono版本授權(quán)受限, 換IL2CPP,IL2CPP VM這套完全自己開發(fā)的組件,就解決了授權(quán)問題。

c: 提高運行效率,換成IL2CPP以后,程序編譯成了硬件目標機器指令,運行效率提升1.5-2.0倍。

?

Unity基于IL2CPP 的架構(gòu)原理,如圖1.1-1所示:

最后一個概念AOT(Ahead of time),AOT技術(shù)指的是將高級開發(fā)語言直接轉(zhuǎn)成傳統(tǒng)的編譯型編程語言(如C/C++),再編譯成機器指令代碼在硬件上運行。IL2CPP可以成為AOT技術(shù)。

?

huatuo熱更新的技術(shù)原理

?

鋪墊完IL2CPP,AOT等概念后,接下來就來說huatuo了。由圖1.1-1可知Unity最終打包運行為:AOT(本地機器指令執(zhí)行)+, IL2CPP VM(提供基礎(chǔ)服務(wù)支撐,如gc)。對于IL2CPP 底層運行模式而言,運行的時候是數(shù)據(jù)內(nèi)存對象+代碼機器指令兩個部分。huatuo做熱更就是擴展了IL2CPP VM的服務(wù),讓它在使用原來數(shù)據(jù)內(nèi)存對象的情況下,擴展了解釋執(zhí)行IL代碼的功能(注意這里的使用”原來數(shù)據(jù)內(nèi)存對象”很重要)。讓IL2CPP的運行模式變?yōu)??數(shù)據(jù)內(nèi)存對象+AOT代碼機器指令+Interpreter IL指令解釋執(zhí)行的3個部分。huatuo做熱更的時候,我們只需要利用Unity?ADF(asmdef, 程序集定義文件)的機制,讓Unity對某一部分單獨編譯出一個IL指令的.dll。熱更時,IL2CPP_huatuo就可以裝載IL指令.dll, 由IL2CPP_huatuo來解釋執(zhí)行。這樣AOT模式+huatuo IL指令解釋執(zhí)行 (Interpreter)讓huatuo能具備熱更新的功能。同時huatuo解釋執(zhí)行使用的是原來AOT的數(shù)據(jù)內(nèi)存對象,所以huatuo熱更新不會有其它熱更新方案需要的接口導出,跨域調(diào)用等一系列問題。讓開發(fā)者在不用做任何特殊處理的情況下,直接使用普通的unity開發(fā)技術(shù)能做到熱更新。由于可以直接使用AOT的數(shù)據(jù)內(nèi)存對象,內(nèi)存占用,性能都會更好。有了這些優(yōu)勢(不用做任何代碼上的處理就能實現(xiàn)熱更),難怪Unity開發(fā)者都歡呼雀躍,因為他們終于能丟掉xLua, ILRuntime又笨又重的殼,直接從底層解決問題。所以我認為未來的huatuo會成為Unity熱更的主流方案。

?

huatuo熱更的革命性優(yōu)勢

?

分析完原理后,我們來看下huatuo的革命性優(yōu)勢:

?

huatuo第1個優(yōu)勢是基于AOT(本地機器代碼執(zhí)行)+Interpreter (IL解釋執(zhí)行)使用同一個內(nèi)存數(shù)據(jù)對象,沒有跨域訪問的問題。我們來拿xLua或ILRuntime熱更方案來舉例,這些方案都有一條原則,盡量減少與Unity C#層的交互,但是這種交互又避免不了而且量大,比如我們要在邏輯熱更代碼里面訪問 Unity C#的GameObject對象數(shù)據(jù),最終在運行的時候,GameObject 會在AOT模式下的原生內(nèi)存數(shù)據(jù)結(jié)構(gòu)對象。由于xLua或ILRuntime有自己的虛擬機,所以不能直接訪問原生GameObject數(shù)據(jù)對象,往往要把訪問里面的數(shù)據(jù)包裝成函數(shù),這樣性能開銷就大大的增加了。而huatuo是在IL2CPP模式下的解釋執(zhí)行,直接可以訪問原生的數(shù)據(jù)對象。

huatuo第2個優(yōu)勢是我們的邏輯代碼更新后(1.0版本到2.0版本),如果你發(fā)布新版本2.0(重新安裝新版本的app),可以直接把更新的邏輯,直接使用AOT編譯出來,不用解釋執(zhí)行,從而獲得AOT的性能。而基于xLua, ILRuntime的熱更方案開發(fā)的代碼(1.0版本到2.0版本),用戶即使重新安裝2.0客戶端后,還是解釋執(zhí)行,新版本的性能無法達到AOT的性能級別。

huatuo 第3個好處是相比傳統(tǒng)的Lua或ILRuntime熱更,他能更新任意部分的代碼。不用像Lua或ILRuntime一樣,分熱更代碼+框架代碼,框架代碼有bug還不能熱更。

有了這些革命性的優(yōu)勢,你沒有理由不關(guān)注+使用huatuo。


熱更新:為什么這么NB?huatuo革命Unity熱更新的評論 (共 條)

分享到微博請遵守國家法律
资阳市| 东丽区| 安阳县| 文水县| 乌兰浩特市| 阜新市| 望江县| 敦化市| 清流县| 庄河市| 怀远县| 乐亭县| 克什克腾旗| 西宁市| 富蕴县| 旬阳县| 治多县| 临漳县| 顺平县| 应用必备| 荥经县| 辉南县| 保定市| 南投县| 南木林县| 长泰县| 玉溪市| 镶黄旗| 芷江| 夹江县| 曲沃县| 庄浪县| 古丈县| 吴忠市| 石首市| 阿瓦提县| 潮州市| 平塘县| 玛沁县| 池州市| 宾阳县|