“熱更新”這個詞,在Unity3D的應(yīng)用下,是有些語義錯誤的,但是作為大家都熟知的一項(xiàng)技術(shù),我們姑且這么叫它,相信很長時間內(nèi),大家依然還會這么叫,甚至有人叫它“暖更新”。
熱更新,是對hot update或者hot fix的翻譯,計(jì)算機(jī)術(shù)語,表示在不停機(jī)的前提下對系統(tǒng)進(jìn)行更改(摘抄一下):
“hot就是熱,機(jī)器運(yùn)行會發(fā)燙,hot就是不停機(jī)的意思。
熱更新,是個很形象的詞,機(jī)器燙的時候更新,開著更新。
比如Windows不重啟的前提下安裝補(bǔ)丁
比如Http服務(wù)器在不重啟的前提下?lián)Q掉一個文件
那么對于Unity3D來說,何謂熱更新?
額……這個真相實(shí)在是不想講出來,因?yàn)楹芏鄷r候,這個詞都用錯了。
Unity3D是一個客戶端工具,用戶是否重啟客戶端,根本是我們不關(guān)心的問題。
很多時候我們用著熱更新這個詞匯,卻不需要真的熱更新。
只有少部分游戲,游戲資源在玩的過程中邊玩邊下,不重啟的前提下變更了資源。
我們不需要用戶不重啟客戶端就能實(shí)現(xiàn)資源代碼的更新,我們需要的是用戶重啟客戶端能實(shí)現(xiàn)資源代碼的更新。
讓我們暫時放過這個我們的需求連詞匯都用錯了這個基本事實(shí),來總結(jié)一下何謂Unity3D熱更新,Unity3D熱更新就是指:用戶重啟客戶端就能實(shí)現(xiàn)客戶端資源代碼更新的需求或者功能。”
熱更新,能夠縮短用戶取得新版客戶端的流程,改善用戶體驗(yàn)。
pc用戶:
下載客戶端->等待下載->安裝客戶端->等待安裝->啟動->等待加載->玩
手機(jī)用戶:
商城下載APP->等待下載->等待安裝->啟動->等待加載->玩
pc用戶:
啟動->等待熱更新->等待加載->玩
有獨(dú)立loader的pc用戶:
啟動loader->等待熱更新->啟動游戲->等待加載->玩
手機(jī)用戶:
啟動->等待熱更新->等待加載->玩
通過對比就可以看出,有沒有熱更新對于用戶體驗(yàn)的影響還是挺大的,主要就是省去用戶自行更新客戶端的步驟。
· 將執(zhí)行代碼預(yù)編譯為assembly dll。
· 將代碼作為TextAsset打包進(jìn)Assetbundle。
· 運(yùn)行時,使用Reflection機(jī)制實(shí)現(xiàn)代碼的功能。
· 更新相應(yīng)的Assetbundle即可實(shí)現(xiàn)熱更新。
· 蘋果官方禁止iOS下的程序熱更新;JIT在iOS下無效。
· 熱更新方案:Unity+Lua插件。
· 需要更新的代碼、資源,都必須打包成AssetBundle(建議使用未壓縮的格式打包)
· 熟悉Unity的幾個重要的路徑
· Resources(只讀)
· StreamingAssets(只讀)
· Application.dataPath(只讀)
· Application.persistentDataPath(可讀寫)
· Resources文件夾下的資源無論使用與否都會被打包
· 資源會被壓縮,轉(zhuǎn)化成二進(jìn)制
· 打包后文件夾下的資源只讀
· 無法動態(tài)更改,無法做熱更新
· 使用Resources.Load加載
· 流數(shù)據(jù)的緩存目錄
· 文件夾下的資源無論使用與否都會被打包
· 資源不會被壓縮和加密
· 打包后文件夾下的資源只讀,主要存放二進(jìn)制文件
· 無法做熱更新
· WWW類加載(一般用CreateFromFile ,若資源是AssetBundle,依據(jù)其打包方式看是否是壓縮的來決定)
· 相對路徑,具體路徑依賴于實(shí)際平臺
·Application.streamingAssetsPath
· IOS: Application.dataPath + “/Raw” 或Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
· 游戲的數(shù)據(jù)文件夾的路徑(例如在Editor中的Assets)
· 很少用到
· 無法做熱更新
· IOS路徑: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
· 持久化數(shù)據(jù)存儲目錄的路徑( 沙盒目錄,打包之前不存在 )
· 文件夾下的資源無論使用與否都會被打包
· 運(yùn)行時有效,可讀寫
· 無內(nèi)容限制,從StreamingAsset中讀取二進(jìn)制文件或從AssetBundle讀取文件來寫入PersistentDataPath中
· 適合熱更新
· IOS路徑: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
· uLua插件原生版本,開山鼻祖
· 不會產(chǎn)生靜態(tài)代碼
· 反射機(jī)制,效率低下,速度慢,gcalloc頻繁
· 已停止更新維護(hù),不支持Unity5.x,淡出主流
· 開發(fā)平臺成熟穩(wěn)定,Bug修復(fù)迅速
· 開發(fā)者眾多,資源豐富
· 靜態(tài)方法,性能優(yōu)
· 有成功商業(yè)產(chǎn)品案例(啪啪三國、超神戰(zhàn)隊(duì)、酷魚吧捕魚、絕地戰(zhàn)警、這不是刀塔等)
· 都是基于原生版本的改進(jìn);未來,兩者會合并成一個插件
開源項(xiàng)目地址:
https://github.com/topameng/CsToLua
· 靜態(tài)方法,性能優(yōu)
· 核心代碼簡潔
· 資源較少,開發(fā)平臺不夠成熟穩(wěn)定
· 無成功商業(yè)產(chǎn)品案例成功商業(yè)產(chǎn)品案例
· 基于原生版本的改進(jìn)
開源項(xiàng)目地址:
https://github.com/pangweiwei/slua
· 淡出主流,想要了解的小伙伴點(diǎn)擊這里:
https://github.com/lightszero/LSharp
· c#實(shí)現(xiàn)的Lua虛擬機(jī),非完整方案
· 淡出主流
4.6、各位專家給出的分析
下圖縱坐標(biāo)為測試用例,橫坐標(biāo)是消耗時間或內(nèi)存分配( 對數(shù)坐標(biāo) )。
熟悉NGUI的小伙伴可以參考這里:
https://github.com/jarjin/SimpleFramework_NGUI
熟悉UGUI的小伙伴可以參考這里: