Unity huatuo 革命性熱更系列1.3 huatuo示例項(xiàng)目源碼分析與啟發(fā)

1.3 huatuo****示例項(xiàng)目源碼分析與啟發(fā)

上一節(jié)我們安裝huatuo的開發(fā)環(huán)境坤塞,然后運(yùn)行示例項(xiàng)目考余,體驗(yàn)了huatuo做熱更新,這節(jié)課我們來分析示例項(xiàng)目的源碼,掌握huatuo做熱更新的主要的步驟著洼,讓你自己的項(xiàng)目很好的基于huatuo來組織熱更新袭灯。有幾個(gè)huatuo的原則要清楚:
對(duì)惹刺下,這里有一個(gè)游戲開發(fā)交流小組,希望大家可以點(diǎn)擊進(jìn)來一起交流一下開發(fā)經(jīng)驗(yàn)呀

(1)Unity ADF機(jī)制來分項(xiàng)目稽荧,可以分成若干項(xiàng)目,避免大量代碼長(zhǎng)時(shí)間的編譯,同時(shí)可以按照更小的顆粒度來做熱更新。

(2)普通開發(fā)中工腋,會(huì)把Unity項(xiàng)目的代碼通過IL2CPP全部轉(zhuǎn)成靜態(tài)的二進(jìn)制指令代碼,如果當(dāng)IL2CPP_huatuo加載了一個(gè)IL代碼的.dll(既有AOT的靜態(tài)代碼姨丈,又裝載了對(duì)應(yīng)的IL代碼),huatuo會(huì)優(yōu)先解釋執(zhí)行裝載的IL代碼擅腰。每個(gè)版本都把.dll生成出來蟋恬,進(jìn)行比對(duì),哪些.dll變化了趁冈,就采用il2cpp_huatuo下載下來,轉(zhuǎn)載執(zhí)行即可歼争。

(3)任何項(xiàng)目的代碼(框架代碼+游戲邏輯)都可以基于huatuo來做熱更新。

(4)huatuo提供熱更的機(jī)制渗勘,至于如何熱更沐绒,熱更哪些完全由自己控制;

我們帶著這些原則來對(duì)示例項(xiàng)目來做源碼分析得到自己開發(fā)項(xiàng)目中的啟發(fā)。

啟發(fā)****1: ****游戲代碼如何分工程與項(xiàng)目

傳統(tǒng)的我們的熱更新項(xiàng)目會(huì)分為:框架代碼****+****游戲邏輯旺坠。你也可以按照這個(gè)標(biāo)準(zhǔn)來劃分,也可以繼續(xù)分更小的顆粒度乔遮,比如游戲邏輯,可以拆分為:戰(zhàn)斗,任務(wù)等取刃。所以我們?cè)谑褂胔uatuo做熱更新的時(shí)候它首先做的是項(xiàng)目拆分,示例代碼中利用Unity 的ADF機(jī)制蹋肮,將項(xiàng)目分成了幾個(gè)工程如下:

Assembly-CSharp.csproj:默認(rèn)的代碼工程,新建代碼默認(rèn)會(huì)被拉入到這個(gè)工程編譯;

Assembly-CSharp-Editor.csproj:編輯器Editor代碼會(huì)被拉入到這個(gè)工程編譯;

BetterStreamingAssets.csproj: 示例項(xiàng)目中的資源ab包加載工程;

HotFix.csproj: 示例項(xiàng)目中測(cè)試熱更的測(cè)試工程;

HotFix2.csproj: 示例項(xiàng)目中的第二個(gè)測(cè)試工程;

Main.csproj: 示例項(xiàng)目中入口主工程,示例項(xiàng)目從這個(gè)入口工程的代碼開始運(yùn)行;

這里給到我們的啟發(fā)璧疗,我們?cè)谧鲎约河螒蝽?xiàng)目的時(shí)候坯辩,也可以根據(jù)自己的項(xiàng)目需求利用Unity ADF機(jī)制,來將項(xiàng)目劃分稱若干工程崩侠,而這些工程漆魔,可以單獨(dú)的生成IL的.dll代碼指令。這樣就可以給IL2CPP_huatuo來解釋執(zhí)行了啦膜。由這里得到的啟發(fā)有送,我們用huatuo做項(xiàng)目的時(shí)候我會(huì)將項(xiàng)目如下劃分,供大家參考:

Assembly-CSharp.csproj:默認(rèn)的代碼工程僧家,這里放啟動(dòng)代碼雀摘,放熱更新版本檢測(cè)代碼,檢測(cè)出來哪些.dll需要更新八拱,基于增量下載更新阵赠,比較出哪些不用更新使用原來自帶的AOT內(nèi)部的代碼,哪些需要更新涯塔,需要更新的用il2cpp_huatuo來裝載進(jìn)來,優(yōu)先執(zhí)行裝載進(jìn)來的.dll指令。

Main.csproj:可以用來做框架工程清蚀,實(shí)現(xiàn)各個(gè)框架模塊,初始化框架,進(jìn)入具體游戲邏輯,提供基礎(chǔ)的服務(wù)匕荸,如SDK服務(wù)等。這個(gè)是傳統(tǒng)熱更的框架層枷邪,一般情況下不用熱更榛搔,使用AOT后的代碼就可以了,如果萬一要熱更东揣,也可以直接熱更生成的main.dll践惑。

若干業(yè)務(wù)邏輯項(xiàng)目工程: 根據(jù)游戲的類型來進(jìn)行區(qū)分若干游戲項(xiàng)目,根據(jù)版本比對(duì)決定這些.dll是否需要被il2cpp_huatuo虛擬機(jī)裝載。

啟發(fā)****2: ****擴(kuò)展編輯器來生成所有****.dll

由huatuo的特性嘶卧,你裝載哪個(gè).dll,就可以動(dòng)態(tài)解釋執(zhí)行對(duì)應(yīng)的.dll的代碼指令尔觉。所以我們就可以得到啟發(fā),把我們項(xiàng)目中所有的除Assembly-CSharp.dll以外的.dll都生成出來。比如1.0版本: Main.dll(游戲框架), game.dll(游戲主邏輯), task.dll(任務(wù)系統(tǒng)), … 比如2.0版本: main.dll, game.dll, task.dll, …芥吟。這樣每次打包發(fā)布的時(shí)候侦铜,我們就可以使用這個(gè)編輯器擴(kuò)展,編譯出來所有的項(xiàng)目中的.dll,并生成一個(gè)所有.dll的md5文件變化列表钟鸵。把最新的一份.dll與md5文件列表放服務(wù)器钉稍,把本地md5文件列表放包里,每次運(yùn)行携添,我們?cè)隽肯螺d最新版本的.dll后嫁盲,我們只要比較服務(wù)器上的.dll md5文件列表,與當(dāng)前版本對(duì)應(yīng).dll的md5文件列表烈掠,決定出哪些.dll需要裝載進(jìn)入il2cpp_huatuo羞秤,就直接裝載即可實(shí)現(xiàn)熱更新,那些沒有變化的.dll,表示可以直接使用AOT模式下的機(jī)器指令,不用熱更解釋執(zhí)行IL指令的.dll左敌。我們來看下示例項(xiàng)目里面是如何編譯我們的.dll指令的,參考對(duì)應(yīng)的編輯器的擴(kuò)展代碼瘾蛋。打開示例項(xiàng)目的Editor/Huatuo文件夾的EditorHelper.cs, 如圖:


沒有什么可說的,調(diào)用API矫限,打包.dll,直接copy過來就可以了哺哼。根據(jù)我們上面的分析,對(duì).dll生成不同版本的.dll md5文件列表這個(gè)需要自己擴(kuò)展一下叼风,示例代碼中沒有取董。

啟發(fā)****3: ****要熱更哪部分代碼****,****就裝載哪部分代碼

使用huatuo做熱更新最后需要掌握的一個(gè)點(diǎn)就是,如何裝載.dll的代碼无宿,當(dāng)我們知道當(dāng)前系統(tǒng)需要裝載哪些.dll讓huatuo解釋執(zhí)行后茵汰,最后一步就是讓huatuo來裝載,我們從這個(gè)示例項(xiàng)目的代碼中可以看到il2cpp_huatuo是如何裝載一個(gè).dll的孽鸡,當(dāng)這個(gè).dll被裝載后,這部分的功能就被解釋執(zhí)行了蹂午。Huatuo如何加載代碼栏豺,我們可以參考示例如下(代碼來自LoadDll.cs):

它分為了發(fā)布模式與Edtior模式,發(fā)布模式就是直接把.dll裝載進(jìn)入il2cpp_huatuo的vm中豆胸,調(diào)用API函數(shù): System.Reflection.Assembly.Load(.dll的二進(jìn)制文件內(nèi)容)奥洼,在底層huatuo做了修改。編輯器模式下晚胡,調(diào)用AppDomain就行裝載就可以了灵奖,所以這個(gè)代碼我們直接可以參考拿過來,比較出哪些.dll要熱更,我就轉(zhuǎn)載它就可以了估盘。

今天的分享就到這里了, 關(guān)注我們桑寨, 接下來還會(huì)繼續(xù)更新huatuo熱更的系列教程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忿檩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爆阶,更是在濱河造成了極大的恐慌燥透,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辨图,死亡現(xiàn)場(chǎng)離奇詭異班套,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)故河,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門吱韭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鱼的,你說我怎么就攤上這事理盆。” “怎么了凑阶?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵猿规,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我宙橱,道長(zhǎng)姨俩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任师郑,我火速辦了婚禮环葵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宝冕。我一直安慰自己张遭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布猬仁。 她就那樣靜靜地躺著帝璧,像睡著了一般先誉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上的烁,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天褐耳,我揣著相機(jī)與錄音,去河邊找鬼渴庆。 笑死铃芦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的襟雷。 我是一名探鬼主播刃滓,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼耸弄!你這毒婦竟也來了咧虎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤计呈,失蹤者是張志新(化名)和其女友劉穎砰诵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捌显,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茁彭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扶歪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片理肺。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖善镰,靈堂內(nèi)的尸體忽然破棺而出妹萨,到底是詐尸還是另有隱情,我是刑警寧澤媳禁,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布眠副,位于F島的核電站,受9級(jí)特大地震影響竣稽,放射性物質(zhì)發(fā)生泄漏囱怕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一毫别、第九天 我趴在偏房一處隱蔽的房頂上張望娃弓。 院中可真熱鬧,春花似錦岛宦、人聲如沸台丛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挽霉。三九已至防嗡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侠坎,已是汗流浹背蚁趁。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留实胸,地道東北人他嫡。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像庐完,于是被迫代替她去往敵國(guó)和親钢属。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容