Unity3D 熱更新方案(集合各位專家的匯總)


http://blog.csdn.net/guofeng526/article/details/52662994

熱更新”這個詞,在Unity3D的應用下,是有些語義錯誤的,但是作為大家都熟知的一項技術,我們姑且這么叫它,相信很長時間內,大家依然還會這么叫,甚至有人叫它“暖更新”。

一、什么是熱更新?

熱更新,是對hot update或者 hot fix的翻譯,計算機術語,表示在不停機的前提下對系統進行更改(摘抄一下):

“hot就是熱,機器運行會發燙,hot就是不停機的意思。

熱更新,是個很形象的詞,機器燙的時候更新,開着更新。

比如Windows不重啟的前提下安裝補丁

比如Http服務器在不重啟的前提下換掉一個文件

那么對於Unity3D來說,何謂熱更新?

額……這個真相實在是不想講出來,因為很多時候,這個詞都用錯了。

Unity3D是一個客戶端工具,用戶是否重啟客戶端,根本是我們不關心的問題。

很多時候我們用着熱更新這個詞匯,卻不需要真的熱更新。

只有少部分游戲,游戲資源在玩的過程中邊玩邊下,不重啟的前提下變更了資源。

我們不需要用戶不重啟客戶端就能實現資源代碼的更新,我們需要的是用戶重啟客戶端能實現資源代碼的更新。

讓我們暫時放過這個我們的需求連詞匯都用錯了這個基本事實,來總結一下何謂Unity3D熱更新,Unity3D熱更新就是指:用戶重啟客戶端就能實現客戶端資源代碼更新的需求或者功能。”

 

二、為什么要熱更新?

熱更新,能夠縮短用戶取得新版客戶端的流程,改善用戶體驗。

沒有熱更新:

pc用戶:

下載客戶端->等待下載->安裝客戶端->等待安裝->啟動->等待加載->玩

手機用戶:

商城下載APP->等待下載->等待安裝->啟動->等待加載->玩

有了熱更新:

pc用戶:

啟動->等待熱更新->等待加載->玩

有獨立loader的pc用戶:

啟動loader->等待熱更新->啟動游戲->等待加載->玩

手機用戶:

啟動->等待熱更新->等待加載->玩

通過對比就可以看出,有沒有熱更新對於用戶體驗的影響還是挺大的,主要就是省去用戶自行更新客戶端的步驟。

三、如何熱更新?Unity3D的熱更新的方法比較

3.1、Android 應用的熱更新

• 將執行代碼預編譯為assembly dll。

• 將代碼作為TextAsset打包進Assetbundle。

• 運行時,使用Reflection機制實現代碼的功能。

• 更新相應的Assetbundle即可實現熱更新。

 

3.2、Android iOS 熱更新的異同

• 蘋果官方禁止iOS下的程序熱更新;JIT在iOS下無效。

• 熱更新方案:Unity+Lua插件。

 

3.3、 使用Lua 插件進行iOS 熱更新的原理

 

 

3.4、Unity 熱更新的注意點

• 需要更新的代碼、資源,都必須打包成AssetBundle(建議使用未壓縮的格式打包)

• 熟悉Unity的幾個重要的路徑

• Resources(只讀)

• StreamingAssets(只讀)

• Application.dataPath(只讀)

• Application.persistentDataPath(可讀寫)

 

3.5、重要路徑之 Resources

• Resources文件夾下的資源無論使用與否都會被打包

• 資源會被壓縮,轉化成二進制

• 打包后文件夾下的資源只讀

• 無法動態更改,無法做熱更新

• 使用Resources.Load加載

 

3.6、重要路徑之StreamingAssets

• 流數據的緩存目錄

• 文件夾下的資源無論使用與否都會被打包

• 資源不會被壓縮和加密

• 打包后文件夾下的資源只讀,主要存放二進制文件

• 無法做熱更新

• WWW類加載(一般用CreateFromFile ,若資源是AssetBundle,依據其打包方式看是否是壓縮的來決定)

• 相對路徑,具體路徑依賴於實際平台

•Application.streamingAssetsPath

• IOS: Application.dataPath + “/Raw” 或Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw

 

3.7、重要路徑之Application.dataPath

• 游戲的數據文件夾的路徑(例如在Editor中的Assets)

• 很少用到

• 無法做熱更新

• IOS路徑: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data

3.8、重要路徑之Application.persistentDataPath

• 持久化數據存儲目錄的路徑( 沙盒目錄,打包之前不存在 )

• 文件夾下的資源無論使用與否都會被打包

• 運行時有效,可讀寫

• 無內容限制,從StreamingAsset中讀取二進制文件或從AssetBundle讀取文件來寫入PersistentDataPath中

• 適合熱更新

• IOS路徑: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents

 

3.9、使用Lua 插件進行iOS 熱更新的總體流程

 

 

 

四、支持Unity iOS 熱更新的各種Lua 插件的對比

4.1、uLua(asset store)

• uLua插件原生版本,開山鼻祖

• 不會產生靜態代碼

• 反射機制,效率低下,速度慢,gcalloc頻繁

• 已停止更新維護,不支持Unity5.x,淡出主流

 

4.2、uLua & cstoLua

• 開發平台成熟穩定,Bug修復迅速

• 開發者眾多,資源豐富

• 靜態方法,性能優

• 有成功商業產品案例(啪啪三國、超神戰隊、酷魚吧捕魚、絕地戰警、這不是刀塔等) 

• 都是基於原生版本的改進;未來,兩者會合並成一個插件

開源項目地址: 

https://github.com/topameng/CsToLua

4.3、sLua

• 靜態方法,性能優

• 核心代碼簡潔

• 資源較少,開發平台不夠成熟穩定

• 無成功商業產品案例成功商業產品案例

• 基於原生版本的改進

開源項目地址:

https://github.com/pangweiwei/slua

4.4、C#Light(L#)

• 淡出主流,想要了解的小伙伴點擊這里:

https://github.com/lightszero/LSharp

4.5、 uniLua

• c#實現的Lua虛擬機,非完整方案

• 淡出主流


4.6、各位專家給出的分析

下圖縱坐標為測試用例,橫坐標是消耗時間或內存分配( 對數坐標 )。

 

 

 

綜合來看 肯定是 uLua & cstoLua會更好一些。

五、實踐

熟悉NGUI的小伙伴可以參考這里:

https://github.com/jarjin/SimpleFramework_NGUI

熟悉UGUI的小伙伴可以參考這里:

https://github.com/jarjin/LuaFramework_UGUI


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM