一句話說(shuō)說(shuō)huatuo和Hybridclr:
huatuo是途游開源的,之前hybird的作者在途游,后來(lái)開源華佗,后來(lái)被途游收回,就寫了hybirdCLR;
一、Unity - IL2CPP技術(shù)原理與AOT
?階段1:C#發(fā)展,---> windows系列平臺(tái)? ---->? 微軟標(biāo)準(zhǔn) .net的標(biāo)準(zhǔn)開發(fā)出來(lái);
? ? ? ? ? ? ? ? 只需要開發(fā)出來(lái)符合.net字節(jié)碼的標(biāo)準(zhǔn)代碼,就可以讓代碼在.net上運(yùn)行起來(lái)。
階段2:項(xiàng)目 --- > Mono項(xiàng)目,.net虛擬機(jī)(Linux、windows、Androud等平臺(tái))+.net開發(fā)環(huán)境;
? ? ? ? ? ? ? ? C# ---> Mono ---> .net字節(jié)碼 ----> .net虛擬機(jī)上運(yùn)行起來(lái)。
階段3:早期Unity --->? Mono方案 ----> 實(shí)現(xiàn)跨平臺(tái)
階段4:Unity --->使用Mono的問題?
? ? ? ? a;程序的執(zhí)行效率,.net字節(jié)碼 ----> 運(yùn)行的;
? ? ? ? b:Mono虛擬機(jī)的移植 ---> webgl --->? bug,mono ----> Unity ---->;Unity 跨平臺(tái)會(huì)收到限制;
? ? ? ? c:版權(quán)問題,Unity Mono. .net授權(quán)
找出了另一條技術(shù)路線:IL2CPP項(xiàng)目
? ? ? ? IL是什么?Intermediate Language 是一種通用的語(yǔ)言架構(gòu)和.net框架的低階(lowest-level)的編程語(yǔ)言
? ? ? ? CLI是什么?Common Language Infrastructrue 特指在.net平臺(tái)下的IL標(biāo)準(zhǔn),CIL類似一個(gè)面向?qū)ο蟮膮R編語(yǔ)言,并且它是完全基于堆棧的,它運(yùn)行在.net虛擬機(jī)上。
? ? ? ? 所以IL與CLI在Unity開發(fā)中 ---> 同一件事情.net平臺(tái)下的字節(jié)碼程序。 ----> IL標(biāo)準(zhǔn)是開發(fā)的(沒有版權(quán)問題)
? ? ? ? .net工具:Unity開發(fā)的C#代碼 ---> IL字節(jié)碼;(可以使用標(biāo)準(zhǔn)的.net開發(fā))
? ? ? ? IL2CPP項(xiàng)目: IL字節(jié)碼 ---> 靜態(tài)編譯型語(yǔ)言(C語(yǔ)言,C++)的代碼;簡(jiǎn)言就是IL --轉(zhuǎn)-->?C++代碼
? ? ? ? 后來(lái)就可以使用xcode、android NDK windows visual studio c++ 來(lái)編譯我們的代碼,把我們的代碼編程本地的機(jī)器指令,直接在OS上執(zhí)行---> 效率 高于 .net的解釋執(zhí)行。
????????AOT是什么?Ahead of time 離線編譯,把高級(jí)語(yǔ)言 ----> 靜態(tài)語(yǔ)言? ----->? 直接編譯成二進(jìn)制機(jī)器指令;
? ? ? ? IL2CPP 這個(gè)項(xiàng)目而言 :采用的AOT技術(shù)
? ? ? ? JIT技術(shù):Just In Time 運(yùn)行時(shí)編譯成二進(jìn)制機(jī)器指令
? ? ? ? IL2CPP vm:IL2CPP的虛擬機(jī),更像一個(gè)庫(kù),提供一些服務(wù);(gc垃圾回收、IL2CPP編寫一些庫(kù)來(lái)提供服務(wù))
? ? ? ? 運(yùn)行時(shí)的時(shí)候:Unity ?== IL2CPP技術(shù)編譯出來(lái)的二進(jìn)制指令 + IL2CPP runtime的環(huán)境(GC,Thread等技術(shù)支撐)
? ? ? ? Interpreter:解釋執(zhí)行
過程圖:
二、huatuo熱更新原理
huatuo熱更新是基于IL2CPP VM這個(gè)環(huán)節(jié)來(lái)的,和其他熱更技術(shù)不同;
Lua方案:Lua內(nèi)置Lua虛擬機(jī) + Lua代碼 (是在Native excutable asm 環(huán)節(jié))
ILRuntime方案:內(nèi)置C#虛擬機(jī) + 解釋執(zhí)行ILRuntime?(是在Native excutable asm 環(huán)節(jié))
內(nèi)置虛擬機(jī):會(huì)有自己解釋執(zhí)行的一個(gè)運(yùn)行環(huán)境,無(wú)法直接繼承MonoBehaviour(IL2CPP 級(jí)別的數(shù)據(jù)對(duì)象),需要封裝一層;
? ? ? ? ? ? ? ? ? ? ? ? 會(huì)有跨域訪問、接口導(dǎo)出等問題 ---> 需要開發(fā)者自己來(lái)處理;:::?麻煩點(diǎn),不符合標(biāo)準(zhǔn)的Unity開發(fā),需要另外做一套另個(gè)標(biāo)準(zhǔn)的開發(fā)。
?2.1 huatuo到底做了什么呢?
IL2CPP runtime 環(huán)境(IL2CPP VM)編寫了一個(gè)解釋器,解釋執(zhí)行IL代碼指令 + 使用的是AOT的數(shù)據(jù)內(nèi)存對(duì)象
正常IL2CPP 執(zhí)行: 數(shù)據(jù)內(nèi)存 + 代碼邏輯指令(二進(jìn)制機(jī)器指令);
huatuo IL2CPP 執(zhí)行:數(shù)據(jù)內(nèi)存(GameObject)+?代碼邏輯指令(二進(jìn)制機(jī)器指令)+ IL代碼指令解釋執(zhí)行
所以huatuo在熱更的時(shí)候,可以隨意的繼承所使用的GameObject、MonoBehvaviour;
huatuo在使用數(shù)據(jù)對(duì)象時(shí),這個(gè)數(shù)據(jù)對(duì)象就是AOT里的東西,熱更項(xiàng)目的類型編譯進(jìn)去就可以了;
huatuo在執(zhí)行時(shí)就是,解釋執(zhí)行IL new GameObject? ---> new AOT的GameObject對(duì)象;
熱更流程:
熱更? -----> IL.dll ----> 運(yùn)行的時(shí)候,huatuo加載IL.dll 來(lái)解釋執(zhí)行;
當(dāng)有更新時(shí),可以將IL.dll 編譯發(fā)布,然后放在服務(wù)器上,客戶端運(yùn)行時(shí)檢查更新,下載最新的IL.dll, 最后IL2CPP vm 轉(zhuǎn)載IL.dll 就實(shí)現(xiàn)了熱更新。
三、huatuo為什么性能高,比其他熱更新方案的優(yōu)勢(shì)有哪些
?優(yōu)勢(shì):
1.huatuo直接使用的是AOT項(xiàng)目中的內(nèi)存對(duì)象,內(nèi)存的占用,跨域都沒有問題;(性能好,內(nèi)存占用少)
2.huatuo不用改變上次的開發(fā)習(xí)慣(不需要另外搞個(gè)虛擬機(jī),搞個(gè)熱更項(xiàng)目)
3.其他熱更項(xiàng)目所不具備的功能,熱更后,可以改變執(zhí)行方式(
? ? ? ? ? ? 比如:原來(lái)是Lua、ILRuntime熱更新的,從1.0 -到- 2.0,就算更新完成,執(zhí)行方式不會(huì)變,一開始是解釋執(zhí)行,更新完,還是解釋執(zhí)行;
? ? ? ? ? ? 但是,huatuo,可以實(shí)現(xiàn)從1.0(的解釋執(zhí)行) --更新到---> 2.0(的直接AOT執(zhí)行)
4.開發(fā)方式:huatuo不需要特殊的開發(fā)模式,直接Unity開發(fā)完就完事了。(不會(huì)有熱更時(shí)的一些問題如:需要特殊的開發(fā)模式、需要熱更項(xiàng)目、不能直接繼承、接口導(dǎo)出等)
5.huatuo可以理論上更新任何代碼,而普通的模式是 框架 + 熱更,框架是不可以熱更的。
四、huatuo熱更新開發(fā)環(huán)境搭建與測(cè)試
?環(huán)境準(zhǔn)備:
????????unity
????????visula studio
????????IL2CPP for windows (不同平臺(tái)有不同的IL2CPP,這里用的是windows平臺(tái))
Unity IL2CPP 下載?https://unity.com/releases/editor/whats-new
? ? ? ? ?打開上面官網(wǎng),選擇自己Unity版本,然后在Component Installers下選擇,你要下載的組件,這里下載 IL2CPP 根據(jù)你的平臺(tái)下載即可。
huatuo準(zhǔn)備:
? ? ? ? a:huatuo核心代碼庫(kù):IL代碼指令解釋執(zhí)行;
? ? ? ? b:IL2CPP_huotuo:IL2CPP的庫(kù),huatuo需要做一些補(bǔ)丁修改,不含huotuo核心代碼 + huaduo核心代碼運(yùn)行的必要環(huán)境;
? ? ? ? 為何什么會(huì)分開呢?是因?yàn)镮L2CPP是Unity維護(hù)的,為了應(yīng)對(duì)Unity對(duì)它的變化,所以分開。
huatuo示例項(xiàng)目:從示例項(xiàng)目中啟發(fā),用到我們的項(xiàng)目中;
huatuo-trial
github 國(guó)外下載https://github.com/focus-creative-games
碼云
國(guó)內(nèi)下載https://gitee.com/focus-creative-games
要注意:huotuo-main(hybridclr-main)是huatuo的源項(xiàng)目、huotuo-trial(hybridclr_trial-main)示例項(xiàng)目、il2cpp_huotuo(il2cpp_plus-main)庫(kù)項(xiàng)目、hybridclr_unity-main是Unity的包配置項(xiàng)目。
hybridclr_unityhttps://gitee.com/focus-creative-games/hybridclr_unity? ? ? ? 打開后,點(diǎn)擊克隆/下載---> HTTPS 鏈接 點(diǎn)擊復(fù)制即可拿到該git鏈接。
?????????
準(zhǔn)備好以后,就可以開始搭設(shè)了。
這里使用的是Unity2021.3.6.f1? hub3.0.1 Hybrid CLR是v2.1.0 il2cpp_plus是v2021-2.1.0
step:1打開Unity工程,在菜單欄Window ---> Package Manager ---> 選擇+號(hào) ---> Add package for dis...(從本地添加包)選擇hybridclr_unity-main下的package.json,點(diǎn)擊打開,即可添加進(jìn)來(lái)。
? ? ? ? ?這一步,也可以直接選擇使用git鏈接里的版本,操作如下:
? ? ? ? 在PackageManager界面,點(diǎn)擊+號(hào)后,選擇 ...from git URL選項(xiàng),然后復(fù)制(拿到)是上面hybridclr_unity里的git鏈接,粘貼進(jìn)去,點(diǎn)擊Add即可,會(huì)拿到最新的插件包。
step:2 在Unity工程中,菜單欄中會(huì)看到 HybridCLR選項(xiàng),打開HybridCLR ---> Intaller... --->顯示未安裝,點(diǎn)擊下面的安裝(靜靜的等待,如果沒有報(bào)錯(cuò),并且安裝狀態(tài)是已安裝,就說(shuō)明安裝好了)恭喜你了,安裝成功!
step:3.解壓出示例項(xiàng)目(huatuo-trial)
step4:多個(gè)項(xiàng)目,Unity ADF機(jī)制,代碼越多,每次修改一下,要全部編譯,時(shí)間消耗比較麻煩;
? ? ? ? ? ? ?ADF機(jī)制,將項(xiàng)目分成多個(gè)不同的工程,然后每次修改后,只編譯你自己所在的工程(節(jié)約編譯時(shí)間),
? ? ? ? ? ? ?huatuo? ---> 就可以針對(duì)不同的dll(做熱更新),不同的功能不同的dll。
step5:普通的直接走AOT,把這些DLL編譯出來(lái),生成到機(jī)器指令里,運(yùn)行;
? ? ? ? ? ? ?然后在熱更新的時(shí)候,ILCPP vm先加載我們的IL.dll就可以更新了。
? ? ? ? ? ? (也就意味著,我們?cè)谑褂胔uatuo時(shí),這幾塊的可以分開開發(fā))
step6:運(yùn)行一下熱更項(xiàng)目。
? ? ? ? ? ? ? ??step6a:如何來(lái)分項(xiàng)目出來(lái)? --->? 構(gòu)建不同的.dll (使用Unity ADF)
? ? ? ? ? ? ? ? ? ? ? ? 在Unity中,在Project視口下Asstes下新建一個(gè)分項(xiàng)目的目錄(GFGame),然后在這個(gè)目錄里,右擊選擇Create ---> Assembly Definition ,就有了一個(gè)分項(xiàng)目集,然后在此文件加下創(chuàng)建腳本,
在vs中打開,就會(huì)看到,他是獨(dú)立在一個(gè)集下的,也就意味著,它可以單獨(dú)打出一個(gè)dll出來(lái)(熱更新就可以依據(jù)這個(gè)dll做獨(dú)立功能或分項(xiàng)目)。
? ? ? ? ?step6b:構(gòu)建一下dll? ----> 發(fā)布熱更新的時(shí)候就要可以使用這里的dll
? ? ? ? ? ? ? ? 使用huatuo的功能,菜單欄HybridCLR--->CompileDll ---> ActiveBuildTarge
????????????????
? ? ? ? ? ? ? ? ?靜等幾秒,構(gòu)建完成后,會(huì)有提示Finish!
? ? ? ? ? ? ? ? ?目前的版本目錄是放在跟Assets同級(jí)的HybridCLR目錄里,具體如下:
?
? ? ? ? ?step6c:熱更.dll + 游戲資源 ---->? 熱更資源.dll 二進(jìn)制資源? ---> 將這些資源打包(ab包,addressbale等)
? ? ? ? ? ? ? ? ? ? ? ? 打ab包,根據(jù)項(xiàng)目不同,按照項(xiàng)目的設(shè)計(jì)即可。 --->打出ab包
? ? ? ? ?step6d:打出的ab包放在了StreammingAssets目錄下,然后根據(jù)實(shí)際需要,放到服務(wù)器上。
到此就做到了熱更新。
到此示例項(xiàng)目就算運(yùn)行起來(lái)了。
五、huatuo熱更新關(guān)鍵源碼分析
? ? ? ? 5.1 打包.dll? ---->分項(xiàng)目分功能打包dll? ?
? ? ? ? 5.2?打包ab包? ----> 將資源打包成ab包
? ? ? ? 5.3 Editor擴(kuò)展
? ? ? ? 5.4 如果啟動(dòng)熱更新邏輯:
? ? ? ? ? ? ? ? 1.LoadDll (裝載dll),這些dll就是代碼邏輯熱更新的關(guān)鍵
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-496858.html
在這里的邏輯可以根據(jù)實(shí)際情況做調(diào)整,比如,在這里裝載時(shí),可以先判斷下本地和服務(wù)器的dll是否不一致(是否需要跟新),如果不需要,就可以直接使用AOT里的,否則更新加載即可。(這里的邏輯時(shí)直接更新了,沒有判斷是否一致)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-496858.html
到了這里,關(guān)于Unity 熱更新 之 huatuo(HybridCLR)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!