推薦閱讀
- CSDN主頁
- GitHub開源地址
- Unity3D插件分享
- 簡書地址
- 我的個人博客
- QQ群:1040082875
大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時更新Unity開發(fā)技巧,覺得有用記得一鍵三連哦。
一、前言
相信只要做過熱更新的小伙伴,都被熱更新搞過心態(tài)吧。
我有一個小伙伴,本來是面向Unity做可視化開發(fā),結(jié)果去做熱更新,直接面對代碼開發(fā),非常難受。
首先,來介紹一下什么是熱更新、熱更新的優(yōu)點(diǎn)、熱更新的解決方案,最后再引出這篇文章的主角HybridCLR C#熱更新方案。
想要省流的小伙伴可以直接跳到第三節(jié):C#熱更新方案HybridCLR的使用。
1-1、什么是熱更新
熱更新就是游戲或軟件更新的時候,不用再重新下載安裝包進(jìn)行安裝。
而是在啟動應(yīng)用程序的時候,在內(nèi)部進(jìn)行資源或代碼的更新。
1-2、熱更新的優(yōu)點(diǎn)
1、可以迅速修復(fù)Bug,避免用戶再去重新下載安裝包,在游戲或軟件內(nèi)部就更新BUG
2、減少安裝包的體積,將資源上傳到服務(wù)器,在運(yùn)行時動態(tài)下載剩余資源
3、迅速進(jìn)行游戲更新,可以不用再上架應(yīng)用商店,直接對游戲或軟件進(jìn)行更新
1-3、熱更新的基本流程
開發(fā)端:
1、開發(fā)端更新了游戲或軟件內(nèi)容,比如更新了腳本、替換了資源
2、將需要更新的代碼或資源,打包成AssetBundle放到服務(wù)器
3、在服務(wù)器上,修改記錄版本號的文件
4、修改服務(wù)器上的對比文件
客戶端:
1、運(yùn)行程序,進(jìn)行版本號的比較,版本號不同則進(jìn)行下面操作
2、下載服務(wù)器上的對比文件,類似于目錄,確定下載列表
3、根據(jù)下載列表,下載所需的資源
4、解壓資源,用最新的對比文件覆蓋本地的對比文件
1-4、熱更新的解決方案
1-4-1、基于Lua的熱更新解決方案
簡介:
基于Lua的熱更新解決方案主要有xLua、toLua、sLua、uLua
這些熱更新方案都是基于Lua語言的。
也可以叫做Lua插件,運(yùn)行Lua,并實現(xiàn)了Lua和C#交互的插件。
為什么用Lua語言做熱更新
至于為什么用Lua語言做熱更新,主要是因為Lua語言是解釋性語言,并不需要事先編譯,而是運(yùn)行動態(tài)解釋執(zhí)行的。
在解釋Lua語言的時候不是翻譯成機(jī)器碼,而是使用C代碼記性解釋,不用開辟可執(zhí)行權(quán)限的內(nèi)存空間,也不會有新代碼執(zhí)行,執(zhí)行解釋的是C語言寫出來的虛擬機(jī)。
為什么不用C#做熱更新
至于為什么不用C#語言做熱更新,因為C#的定位是一個追求效率且功能強(qiáng)大的編譯型語言,在運(yùn)行時需要代碼,就將C#的中間語言MSIL轉(zhuǎn)換成機(jī)器碼的編譯 JIT 。
在Android環(huán)境中支持 JIT ,但是IOS不允許獲取具有可執(zhí)行權(quán)限的內(nèi)存空間,不能通過DLL文件直接更新代碼。
uLua
Lua插件的原生版本,不會產(chǎn)生靜態(tài)代碼,反射機(jī)制,效率低下,速度慢,GC頻繁,已停止更新。
xLua
XLua是騰訊開發(fā)的開源Lua插件,為Unity、.Net、Mono等環(huán)境增加Lua腳本編程的能力,借助xLua可以使Lua代碼與C#代碼相互調(diào)用。
所以xLua可以很方便地實現(xiàn)Lua在Unity3D中的使用。
本質(zhì)是實現(xiàn)了運(yùn)行在C#環(huán)境上的Lua虛擬機(jī)使得Lua可以和C#相互調(diào)用和訪問,利用 IL 注入,實現(xiàn)用Lua函數(shù)替換C#原函數(shù)。
toLua
toLua基于LuaInterface。
LuaInterface是一個實現(xiàn)lua和微軟.Net平臺的 CLR 混合編程的開源庫,使得lua腳本可以實例化 CLR 對象,訪問屬性,調(diào)用方法甚至使用lua函數(shù)來處理事件。
本質(zhì)就是提供一個Lua的運(yùn)行環(huán)境(虛擬機(jī)),為Unity提供編程的能力,讓C#和Lua可以相互調(diào)用合訪問。
sLua
sLua代碼執(zhí)行好,性能比toLua低。
1-4-2、使用Lua熱更新方案的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- Lua語言由C語言編寫,通用性強(qiáng),可以運(yùn)行在各類操作系統(tǒng)
- Lua語言是解釋性語言,由虛擬器解釋執(zhí)行,無需進(jìn)行編譯
- 有很多成熟的項目在使用Lua,有較多的使用文檔
缺點(diǎn):
- 學(xué)使用一門Lua語言,增加學(xué)習(xí)和開發(fā)成本(心酸淚)
- Lua是弱類型的非面向?qū)ο蟮恼Z言,在大型項目中容易造成結(jié)構(gòu)混亂和維護(hù)困難的問題
- Lua需要在C#環(huán)境中提供運(yùn)行環(huán)境,對Lua和C#進(jìn)行相互轉(zhuǎn)換和調(diào)用,效率低下,不如原生C#進(jìn)行開發(fā)
1-4-3、基于C#的熱更新方案
使用C#進(jìn)行熱更新方案,上面已經(jīng)提到過了,可以使用DLL替換進(jìn)行代碼更新。
在Android環(huán)境中支持 JIT ,但是IOS不允許獲取具有可執(zhí)行權(quán)限的內(nèi)存空間,這就直接要求 JIT 要以full
AOT 模式,這種模式把IL直接翻譯成機(jī)器碼而不是在運(yùn)行期間。不能通過DLL文件直接更新代碼。
這種形式下,要不就放棄IOS平臺,只針對Android或Win環(huán)境進(jìn)行熱更新。
要不就使用其他方式。
總結(jié)一下就是更新DLL。
1-4-4、基于C#熱更新方案的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- Unity開發(fā)均使用C#,開發(fā)語言統(tǒng)一,編碼更容易。
- 使用純C#開發(fā)無需另創(chuàng)虛擬機(jī)等環(huán)境,效率高,性能遠(yuǎn)高于Lua
缺點(diǎn):
- 方案均有各自的局限性,直接反射方式不僅損耗性能,在不支持JIT的系統(tǒng)(IOS)上無法使用。
- ILRuntime解決了 JIT 的問題但不夠成熟,使用問題較多,需要較高的動手解決問題能力。
解決方案:
- DLL反射熱更新: 使用編譯后的DLL文件進(jìn)行替換,利用反射方式把所需C#組件綁定到相應(yīng)的對象上使用。
- ILRuntime:本質(zhì)還是DLL的替換,但實現(xiàn)了一個 ILR 使其能夠在不支持 JIT 的硬件環(huán)境(IOS)下實現(xiàn)代碼熱更新。
二、C#熱更新方案HybridCLR介紹
介紹了C#熱更新方案的優(yōu)缺點(diǎn),就說一下這篇文章的主角,HybridCLR: C#熱更新方案。
2-1、簡介
HybridCLR是一個特性完整、零成本、高性能、低內(nèi)存的近乎完美的c#熱更新方案。
HybridCLR提供一個非常完整的跨平臺 CLR 運(yùn)行時,不僅能在Android平臺,也能在IOS、Consoles等限制了JIT的平臺上高效地以 AOT +interpreter混合模式執(zhí)行。
Unity開發(fā)者從此可以完全使用c#開發(fā),并且零成本使用幾乎所有的c#特性,再也不需要使用各種腳本或者不完整的熱更新方案了。
2-2、優(yōu)點(diǎn)
- 特性完整。 近乎完整實現(xiàn)了ECMA-335規(guī)范,除了 下文中"限制和注意事項" 之外的特性都支持。
- 零學(xué)習(xí)和使用成本。 HybridCLR是完整的 CLR 運(yùn)行時,熱更新代碼與 AOT 代碼無縫工作。不需要額外寫- - 任何特殊代碼、沒有代碼生成,也沒有什么特殊限制。腳本類與 AOT 類在同一個運(yùn)行時內(nèi),即使反射、多線程(volatile、ThreadStatic、Task、async)之類的代碼都能夠正常工作。
- 執(zhí)行高效。實現(xiàn)了一個極其高效的寄存器解釋器,所有指標(biāo)都大幅優(yōu)于其他熱更新方案。性能測試報告
- 內(nèi)存高效。 熱更新腳本中定義的類跟普通c#類占用一樣的內(nèi)存空間,遠(yuǎn)優(yōu)于其他熱更新方案。內(nèi)存占用報告
- 原生支持修復(fù) AOT 部分代碼。不額外增加任何開發(fā)和運(yùn)行開銷。
2-3、工作原理
HybridCLR擴(kuò)充了unity的 il2cpp runtime,將它由純AOT運(yùn)行時改造為"AOT + Interpreter"混合運(yùn)行方式,從底層徹底支持了熱更新dll。
更具體地說,HybridCLR做了一下幾點(diǎn)工作:
- 實現(xiàn)了一個高效的元數(shù)據(jù)(dll)解析庫
- 改造了 il2cpp 的元數(shù)據(jù)管理模塊,實現(xiàn)了元數(shù)據(jù)的動態(tài)注冊
- 實現(xiàn)了一個IL指令集到自定義的寄存器指令集的compiler
- 實現(xiàn)了一個高效的寄存器解釋器
- 額外提供大量的instinct函數(shù),提升解釋器性能
- 提供hotfix AOT 的支持
2-4、與其他熱更新方案的區(qū)別
其他熱更新方案方案:
使用獨(dú)立虛擬機(jī),與 il2cpp 的關(guān)系本質(zhì)上相當(dāng)于mono中嵌入lua。
因為類型系統(tǒng)不統(tǒng)一,為了讓熱更新類型能夠繼承 AOT 類型,需要寫適配器,而且解釋器中的類型不能為主工程點(diǎn)的類型系統(tǒng)所識別。
特性不不完整、開發(fā)麻煩、運(yùn)行效率底下。
HybridCLR熱更新方案
這是原生的C#熱更新方案,il2cpp 相當(dāng)于mono的 AOT 模塊,HybridCLR相當(dāng)于 mono 的 iterpreter 模塊,兩者合一成為完成 mono 。
HybridCLR通過System.Reflection.Assembly.Load動態(tài)加載dll,從而支持ios平臺的熱更新。
HybridCLR由原生runtime實現(xiàn),可以與其他主工程AOT部分類型相等并且統(tǒng)一,可以任意調(diào)用、繼承、反射、多線程,不需要再寫適配器。
2-5、支持版本
- 支持所有il2cpp平臺,包括PC(Win32和Win64)、Android(armv7、armv8)、NS、WEBGL平臺。
- 支持Unity 2020-2021所有LTS版本
三、C#熱更新方案HybridCLR的使用
3-1、快速開始
說在前面:本教程了為了適應(yīng)更多童鞋,教程比較詳細(xì),動手能力強(qiáng)的小伙伴可以直接訪問 官網(wǎng)地址 自行摸索也可。
3-1-1、將示例項目下載下來
https://github.com/focus-creative-games/hybridclr_trial
打不開Github的也可以直接使用CSDN下載:https://download.csdn.net/download/q764424567/86338805
3-1-2、安裝Unity,安裝C++模塊,打開項目
(1)安裝Unity 2020.3.33,版本:2020.3.33f1
安裝Unity 2020.3.33f1 記得安裝WIndows Build Support (II2CPP)模塊:
PS:沒有這個版本的記得安裝一下,HybridCLR目前只支持2020-2021的LTS版本。
(2)Visual Studio 添加 C++模塊:
PS:IL2CPP模塊和C++模塊是必須安裝的
(3)打開示例工程:
打開后,控制臺會報一個錯誤:
是讓我們安裝il2cpp。
3-1-3、安裝il2cpp
(1)找到自己 Unity/2020.3.33f1c2/Editor/Data/il2cpp
文件夾:
比如我的路徑:F:\Frank_Software\Unity\2020.3.33f1c2\Editor\Data\il2cpp
(2)找到項目目錄下的HybridCLRDData文件夾,進(jìn)入這個文件夾:
找到init_local_il2cpp_data.bat文件,右鍵選擇編輯:
將IL2CPP_PATH的路徑改成自己的Unity/2020.3.33的il2cpp路徑:
(3)保存文件后,雙擊init_local_il2cpp_data.bat文件:
這種情況是git沒有安裝,安裝Git后重試。
3-1-4、打包運(yùn)行程序
在菜單欄選擇Build→Win64:
運(yùn)行之后:
在打包的過程中可能會遇到很多問題,打包失敗。
可能但不包括的問題有:
- Unity沒有安裝II2CPP模塊
- VS沒有安裝c++模塊
- bat腳本沒有更新,要用最新的bat腳本
出現(xiàn)問題后排查一下問題。
3-1-5、進(jìn)行熱更新
先運(yùn)行一下打包出來的程序:
打開Unity工程,修改Assets/HotFix2/App.cs腳本的內(nèi)容,在Main函數(shù)中增加一行Log:
HotFix和HotFix2文件存放的熱更新的文件
在菜單欄點(diǎn)擊HybridCLR→BuildBundles→ActiveBuildTarget,重新打一個ab包:
將目錄hybridclr_trial-main\Assets\StreamingAssets下的文件復(fù)制到
Release-Win64\HybridCLRTrial_Data\StreamingAssets目錄:
這就完成了熱更新文件的替換,重新運(yùn)行程序就可以看到剛剛修改的日志輸出代碼已經(jīng)生效:
3-2、常見問題
總結(jié)一下遇到的問題吧。
3-2-1、目前選擇的腳本后端(IL2CPP)沒有安裝。
解決方法:
安裝Unity 2020.3.33f1 記得安裝WIndows Build Support (II2CPP)模塊。
VS記得安裝c++模塊
3-2-2、打包錯誤:IL2CPP.Building.BuilderFaiedeXcveption il2cpp-api.cpp
解決方法:
更新一個bat腳本,也就是這個東西:
最新的bat文件可以看這里:
https://github.com/focus-creative-games/hybridclr_trial/blob/main/HybridCLRData/init_local_il2cpp_data.bat
全選替換一下即可。
3-2-3、在“GameAssembly”中找不到名為“HuatuoApi_LoadMetadataForAOTAssembly”的入口點(diǎn)。
這個主要是HotFix2文件中App.cs的這個函數(shù):
在LoadMetadataForAOTAssembly方法中,載入了dll,使用了裁剪之前的版本。
可以參照HybridCLR_trial項目,在BuildProcessor中,生成裁剪后的dll后,將dll拷貝到他處。
更簡單的方法是:干掉這個函數(shù)(用上的時候再研究)。
3-3、相關(guān)工具推薦
3-3-1、熱更新框架UnityGameFramework_HybridCLR
一鍵生成環(huán)境:
3-3-2、無感知邏輯熱更工具 Assemblies-Hotfix-Toolkit-Unity
主要功能:
(1)對指定的熱更程序集進(jìn)行校驗:
a. 引用框為空則警示
b. 識別編輯器程序集并警示
c. 識別被默認(rèn)程序集引用并警示(默認(rèn)程序集:Assembly-CSharp.dll,Assembly-CSharp-firstpass.dll)
d. 如果熱更程序集被引用,則展示被引用的程序集并提示需要修復(fù)
(2)熱更程序集在 Addressables 打包時自動轉(zhuǎn)存為 .bytes 文件并打包到 ab 中
(3)將 .bytes 文件及其配置文件 自動加入 Addressables Group
(4)對加載的程序集自動進(jìn)行拓?fù)渑判?,保證程序集按正確的引用順序加載
3-3–3、Unity框架 TEngine
TEngine是一個簡單(新手友好)且強(qiáng)大的Unity框架,對于需要一套上手快、文檔清晰、高性能且可拓展性極強(qiáng)的開發(fā)者或者團(tuán)隊來說是一個很好的游戲開發(fā)框架解決方案。
四、后記
官方網(wǎng)站HybridCLR文檔 (focus-creative-games.github.io)
HybridCLR(臥龍wolong)
新手群:428404198
進(jìn)階群:651188171
倉庫:
HybridCLR
https://github.com/focus-creative-games/hybridclr
https://gitee.com/focus-creative-games/hybridclr
你的點(diǎn)贊就是對博主的支持,有問題記得留言:
Unity愛好者交流群:1040082875
主頁有聯(lián)系方式。文章來源:http://www.zghlxwxcb.cn/news/detail-793103.html
博主還有跟多寶藏文章等待你的發(fā)掘哦:文章來源地址http://www.zghlxwxcb.cn/news/detail-793103.html
專欄 | 方向 | 簡介 |
---|---|---|
Unity3D開發(fā)小游戲 | 小游戲開發(fā)教程 | 分享一些使用Unity3D引擎開發(fā)的小游戲,分享一些制作小游戲的教程。 |
Unity3D從入門到進(jìn)階 | 入門 | 從自學(xué)Unity中獲取靈感,總結(jié)從零開始學(xué)習(xí)Unity的路線,有C#和Unity的知識。 |
Unity3D之UGUI | UGUI | Unity的UI系統(tǒng)UGUI全解析,從UGUI的基礎(chǔ)控件開始講起,然后將UGUI的原理,UGUI的使用全面教學(xué)。 |
Unity3D之讀取數(shù)據(jù) | 文件讀取 | 使用Unity3D讀取txt文檔、json文檔、xml文檔、csv文檔、Excel文檔。 |
Unity3D之?dāng)?shù)據(jù)集合 | 數(shù)據(jù)集合 | 數(shù)組集合:數(shù)組、List、字典、堆棧、鏈表等數(shù)據(jù)集合知識分享。 |
Unity3D之VR/AR(虛擬仿真)開發(fā) | 虛擬仿真 | 總結(jié)博主工作常見的虛擬仿真需求進(jìn)行案例講解。 |
Unity3D之插件 | 插件 | 主要分享在Unity開發(fā)中用到的一些插件使用方法,插件介紹等 |
Unity3D之日常開發(fā) | 日常記錄 | 主要是博主日常開發(fā)中用到的,用到的方法技巧,開發(fā)思路,代碼分享等 |
Unity3D之日常BUG | 日常記錄 | 記錄在使用Unity3D編輯器開發(fā)項目過程中,遇到的BUG和坑,讓后來人可以有些參考。 |
到了這里,關(guān)于【Unity3D熱更新】Unity3D 零成本、高性能的C#的熱更新框架:HybridCLR的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!