1. 程式人生 > >Unity3D熱更新方案網摘總結

Unity3D熱更新方案網摘總結

xiang 分配 3.5 速度慢 for 小夥伴 source 為什麽 software

參考:http://blog.csdn.net/guofeng526/article/details/52662994
http://blog.csdn.net/u010019717/article/details/50853207

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

一、什麽是熱更新?

  • 廣義定義
  • 無需關閉服務器,不停機狀態下修復漏洞,更新資源等,重點是更新邏輯代碼。
  • 狹義定義( iOS熱更新)
  • 無需將代碼重新打包提交至AppStore,即可更新客戶端的執行代碼,即不用下載app而自動更新程序。
  • 現狀
  • 蘋果禁止了C#的部分反射操作,禁止JIT(即時編譯,程序運行時創建並運行新代碼),不允許邏輯熱更新,只允許使用AssetBundle進行資源熱更新。

二、為什麽要熱更新?

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

  • 縮短用戶獲取新版應用的客戶端的流程,改善用戶體驗。
  • 具體到iOS平臺的應用上,有以下幾個原因

? App Store的審核周期難控制。

  • 手機應用更新頻繁。
  • 對於大型應用,更新成本太大。
  • 終極狀態
  • 不重新下載、不停機狀態下完全變換一個應用的內容。

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

3.1Android 應用的熱更新

? 將執行代碼預編譯為

assembly dll

? 將代碼作為TextAsset打包進Assetbundle

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

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

3.2Android iOS 熱更新的異同

? 蘋果官方禁止iOS下的程序熱更新;JITios下無效。

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

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

技術分享

3.4Unity 熱更新的註意點

? 需要更新的代碼、資源,都必須打包成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.1uLua(asset store)

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

? 不會產生靜態代碼

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

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

4.2uLua & cstoLua

? 開發平臺成熟穩定,Bug修復迅速

? 開發者眾多,資源豐富

? 靜態方法,性能優

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

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

開源項目地址:

https://github.com/topameng/CsToLua

4.3sLua

? 靜態方法,性能優

? 核心代碼簡潔

? 資源較少,開發平臺不夠成熟穩定

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

? 基於原生版本的改進

開源項目地址:

https://github.com/pangweiwei/slua

4.4C#Light(L#)

? 淡出主流,想要了解的小夥伴點擊這裏:

https://github.com/lightszero/LSharp

4.5 uniLua

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

? 淡出主流

4.6、XLua

騰訊開源xlua

https://github.com/Tencent/xLua


4.7、各位專家給出的分析

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

技術分享技術分享技術分享

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

五、實踐

熟悉NGUI的小夥伴可以參考這裏:

https://github.com/jarjin/SimpleFramework_NGUI

熟悉UGUI的小夥伴可以參考這裏:

https://github.com/jarjin/LuaFramework_UGUI

Unity3D熱更新方案網摘總結