huatuo 零成本高性能的Unity全平臺(tái)原生c#熱更新方案



本質(zhì)比較
huatuo是原生的c#熱更新方案。原始il2cpp相當(dāng)于只有aot的mono,而huatuo則給il2cpp新增了原生的interpreter模塊,使得il2cpp變成一個(gè)全功能的mono,原生(即通過(guò)System.Reflection.Assembly.Load)支持動(dòng)態(tài)加載dll,從而支持ios等平臺(tái)的熱更新。其他熱更新方案則是新增了一個(gè)獨(dú)立于il2cpp的第三方vm。
正因?yàn)閔uatuo是原生runtime級(jí)別實(shí)現(xiàn),熱更新部分的類型與主工程AOT部分類型是完全等價(jià)并且無(wú)縫統(tǒng)一的??梢噪S意調(diào)用、繼承、反射、多線程,不需要生成代碼或者寫(xiě)適配器。
其他熱更新方案則是獨(dú)立vm,與il2cpp的關(guān)系本質(zhì)上相當(dāng)于mono嵌lua的關(guān)系。因此類型系統(tǒng)不統(tǒng)一,為了讓熱更新類型能夠繼承AOT部分類型,需要寫(xiě)適配器,并且解釋器中的類型不能為主工程的類型系統(tǒng)所識(shí)別。
實(shí)際使用體驗(yàn)或者特性比較
huatuo學(xué)習(xí)和使用成本幾乎為零。huatuo 讓il2cpp變成全功能的mono,學(xué)習(xí)和使用成本幾乎為零,幾乎零侵入性。而其他方案則有大量的坑和需要規(guī)避的規(guī)則,學(xué)習(xí)和使用成本,需要對(duì)原項(xiàng)目作大量改造。
huatuo可以使用所有c#的特性。而其他方案往往有大量的限制。
huatuo中可以直接支持使用和繼承主工程中的類型。其他方案要寫(xiě)適配器或者生成代碼。
huatuo中熱更新類型與主工程的AOT類型無(wú)縫統(tǒng)一。huatuo中反射代碼能夠正常工作的,主工程部分也可以通過(guò)標(biāo)準(zhǔn)Reflection接口創(chuàng)建出熱更新對(duì)象。其他方案做不到。
huatuo對(duì)多線程支持良好。像多線程、ThreadStatic、async等等特性都是huatuo直接支持,其他方案除了async特性外均難以支持。
huatuo中Unity工作流與原生幾乎完全相同。huatuo中熱更新MonoBehaviour可以直接掛載在熱更新資源上,并且正確工作。其他方案不行。
huatuo兼容性極高。各種第三方庫(kù)只要在il2cpp下能工作,在huatuo下也能正常工作。其他方案往往要大量魔改源碼。
huatuo內(nèi)存效率極高。huatuo中熱更新類型與主工程的AOT類型完全等價(jià),占用一樣多的空間。其他方案的同等類型則是假類型,不僅不能被runtime識(shí)別,還多占了數(shù)倍空間。
huatuo執(zhí)行效率高。huatuo中熱更新部分與主工程AOT部分交互屬于il2cpp內(nèi)部交互,效率極高。而其他方案則是獨(dú)立虛擬機(jī)與il2cpp之間的交互,不僅交互麻煩還效率低下。
文檔
wiki
快速上手
FAQ
示例項(xiàng)目
知乎專欄
支持與聯(lián)系 QQ群: 651188171(huatuo c#熱更新 開(kāi)發(fā)交流群)
穩(wěn)定性狀況
技術(shù)評(píng)估上目前穩(wěn)定性處于Alpha版本與Beta版本之間。
完成了絕大多數(shù)指令的單元測(cè)試。只有calli、initblk等少數(shù)難以直接在c#里構(gòu)造的指令未添加對(duì)應(yīng)的單元測(cè)試。
對(duì)照c#規(guī)范完成各項(xiàng)語(yǔ)法測(cè)試。
測(cè)試了游戲常用庫(kù)和框架的兼容性,兼容性良好。 參見(jiàn)兼容性報(bào)告
可以正確地加載?luban?配置
可以正確地運(yùn)行?2048這樣的輕量小游戲
可以運(yùn)行?StarForce?這樣的小型游戲
目前已經(jīng)能在pc平臺(tái)順利運(yùn)行一個(gè)大型的MMORPG游戲項(xiàng)目。
RoadMap
huatuo雖然與il2cpp相關(guān),但絕大多數(shù)核心代碼獨(dú)立于il2cpp,很容易移植(預(yù)計(jì)一個(gè)月)到其他不支持AOT+Interpreter的CLR平臺(tái)。無(wú)論unity如何版本變遷,哪怕廢棄了il2cpp改用.net 6+,huatuo會(huì)持續(xù)跟進(jìn),穩(wěn)定地提供跨平臺(tái)的CLR熱更新服務(wù),直至某天.net官方直接支持AOT+Interpreter,則huatuo完成其歷史使命。
持續(xù)修復(fù)bug,在Win平臺(tái)能正常運(yùn)行一個(gè)中大型游戲 (2022.4)
持續(xù)跟進(jìn)unity的版本更新,支持更多的unity版本。查看現(xiàn)在支持的Unity版本?(2022.4)
推進(jìn)Android與ios的全平臺(tái)測(cè)試 (2022.5)
支持 hotfix AOT部分的bug (2022.6)
除去大多數(shù)普通AOT泛型類限制 (2022.6)
支持增量式gc。 (2022.7)
指令優(yōu)化,編譯后指令數(shù)減少到原來(lái)1/4-1/2,基礎(chǔ)指令和大多數(shù)對(duì)象模型指令有100%-300%的性能提升。 (2022.7 出預(yù)覽版本)
支持 extern函數(shù) (2022.7)
其他內(nèi)存和效率優(yōu)化,以及代碼重構(gòu)
===支持godot引擎===(2022.12)